Eric Farr
Eric Farr

Reputation: 2723

SQLite.Interop.dll not getting picked up by OctoPack

I've got a relatively new MVC5 project being built with TeamCity and deployed by Octopus Deploy. Everything was great until I added SQLite through NuGet. When the project gets built, I get an x86\SQLite.Interop.dll and an x64\SQLite.Interop.dll under my bin directory and it runs fine.

The problem is that OctoPack doesn't pick up either file; so, my NuGet package that I deploy to my server doesn't have it. How does one fix this?

Upvotes: 4

Views: 830

Answers (3)

Nicholas J. Markkula
Nicholas J. Markkula

Reputation: 1572

You need to add a nuspec file with a files element to tell octopack that it should include the SQLite.interop.dll binaries.

<files>
    <file src="bin\x86\SQLite.interop.dll" target="x86" />
    <file src="bin\x64\SQLite.interop.dll" target="x64" />
</files>

Then, you need to reorder the imports in your project file so that SQLite comes before Octopack, this will ensure that SQLite.interop.dll is copied before Octopack runs.

<Import Project="..\packages\System.Data.SQLite.Core.1.0.105.2\build\net451\System.Data.SQLite.Core.targets" Condition="Exists('..\packages\System.Data.SQLite.Core.1.0.105.2\build\net451\System.Data.SQLite.Core.targets')" />
<Import Project="..\packages\OctoPack.3.0.42\tools\OctoPack.targets" Condition="Exists('..\packages\OctoPack.3.0.42\tools\OctoPack.targets')" />

Finally, make sure to add the parameter OctoPackEnforceAddingFiles=true, this tells octopack to include the files targeted by the Files element in the nuspec file.

Upvotes: 1

StrangeWill
StrangeWill

Reputation: 2136

I did something similar, but I HATE checking in binaries to source control, so I added this to my nuspec file:

<files>
  <file src="..\..\packages\System.Data.SQLite.Core.1.0.98.1\build\net45\x86\SQLite.interop.dll" target="x86" />
  <file src="..\..\packages\System.Data.SQLite.Core.1.0.98.1\build\net45\x64\SQLite.interop.dll" target="x64" />
</files>

Just go yank them out of the packages dir, I guess you could do something like this:

<files>
  <file src="..\..\packages\System.Data.SQLite.Core.*\build\net45\x86\SQLite.interop.dll" target="x86" />
  <file src="..\..\packages\System.Data.SQLite.Core.*\build\net45\x64\SQLite.interop.dll" target="x64" />
</files>

And I think it'll work regardless of version

Upvotes: 1

Eric Farr
Eric Farr

Reputation: 2723

The fine folks at Octopus Deploy pointed me to this help page that got me most of the way there.

For anyone else who runs into this particular problem, I originally added this to my .nuspec file:

<files>
    <file src="bin\x86\*.*" target="bin\x86" />
    <file src="bin\x64\*.*" target="bin\x64" />
</files>

but nothing got copied; so, I changed it to this:

<files>
    <file src="bin\x86\SQLite.interop.dll" target="bin\x86" />
    <file src="bin\x64\SQLite.interop.dll" target="bin\x64" />
</files>

Then TeamCity had a build error because x86 and x64 were empty. It looks like OctoPack somehow runs before those files get copied. It's a hack that I hope to remove at some point, but I got things working by adding those two files to my project, and changing my nuspec file to this:

<files>
    <file src="SQLiteFiles\x86\SQLite.interop.dll" target="bin\x86" />
    <file src="SQLiteFiles\x64\SQLite.interop.dll" target="bin\x64" />
</files>

Also, don't forget to add OctoPackEnforceAddingFiles=true in TeamCity.

Upvotes: 1

Related Questions