4

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?

Eric Farr
  • 2,683
  • 21
  • 30

3 Answers3

1

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.

Eric Farr
  • 2,683
  • 21
  • 30
1

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

StrangeWill
  • 2,106
  • 1
  • 23
  • 36
1

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.

Nicholas J. Markkula
  • 1,542
  • 4
  • 18
  • 30