Asp.net mvc OctoPack无法获取SQLite.Interop.dll

Asp.net mvc OctoPack无法获取SQLite.Interop.dll,asp.net-mvc,sqlite,teamcity,octopus-deploy,Asp.net Mvc,Sqlite,Teamcity,Octopus Deploy,我有一个相对较新的MVC5项目正在与TeamCity一起构建,并由Octopus Deploy部署。在我通过NuGet添加SQLite之前,一切都很好。构建项目时,我在bin目录下获得了一个x86\SQLite.Interop.dll和一个x64\SQLite.Interop.dll,并且运行良好 问题是,OctoPack无法获取任何一个文件;因此,我部署到服务器的NuGet包没有它。如何解决这个问题呢?八达通部署公司的优秀员工向我指出了这一点,让我在大部分时间里都做到了这一点 对于遇到此特定问

我有一个相对较新的MVC5项目正在与TeamCity一起构建,并由Octopus Deploy部署。在我通过NuGet添加SQLite之前,一切都很好。构建项目时,我在bin目录下获得了一个x86\SQLite.Interop.dll和一个x64\SQLite.Interop.dll,并且运行良好


问题是,OctoPack无法获取任何一个文件;因此,我部署到服务器的NuGet包没有它。如何解决这个问题呢?

八达通部署公司的优秀员工向我指出了这一点,让我在大部分时间里都做到了这一点

对于遇到此特定问题的其他人,我最初将其添加到.nuspec文件中:

<files>
    <file src="bin\x86\*.*" target="bin\x86" />
    <file src="bin\x64\*.*" target="bin\x64" />
</files>
<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>

但是没有任何东西被复制;因此,我将其改为:

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

然后TeamCity出现生成错误,因为x86和x64为空。看起来OctoPack在这些文件被复制之前不知怎么运行了。这是一个我希望在某个时候删除的黑客行为,但通过将这两个文件添加到我的项目中,并将我的nuspec文件更改为:

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


另外,别忘了在TeamCity中添加OctoPackEnforceAddingFiles=true。

我做了类似的事情,但我讨厌将二进制文件签入到源代码管理中,所以我将此添加到我的nuspec文件中:

<files>
    <file src="bin\x86\*.*" target="bin\x86" />
    <file src="bin\x64\*.*" target="bin\x64" />
</files>
<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>

只要把它们从包裹里拽出来,我想你可以这样做:

<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>


我认为无论版本如何,它都能工作。您需要添加一个带有files元素的nuspec文件,告诉octopack它应该包含SQLite.interop.dll二进制文件

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

然后,您需要对项目文件中的导入进行重新排序,以便SQLite位于Octopack之前,这将确保在Octopack运行之前复制SQLite.interop.dll

<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')" />

最后,确保添加参数
OctoPackEnforceAddingFiles=true
,这会告诉octopack在nuspec文件中包含files元素所针对的文件