我有一个相对较新的MVC5项目正在使用TeamCity构建并由Octopus Deploy部署。在我通过NuGet添加SQLite之前,一切都很棒。当项目构建完成后,我在bin目录下获得了一个x86 \ SQLite.Interop.dll和一个x64 \ SQLite.Interop.dll,它运行正常。
问题是OctoPack没有拿起任何一个文件;所以,我部署到服务器的NuGet包没有它。如何解决这个问题?
答案 0 :(得分:1)
Octopus Deploy的优秀人员指出我this help page让我大部分都在那里。
对于遇到此特定问题的其他人,我最初将此添加到我的.nuspec文件中:
<files>
<file src="bin\x86\*.*" target="bin\x86" />
<file src="bin\x64\*.*" target="bin\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。
答案 1 :(得分:1)
我做了类似的事情,但我讨厌检查二进制文件来源代码控制,所以我把它添加到我的nuspec文件中:
<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>
只是把它们从包dir中拉出来,我想你可以这样做:
<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>
我认为无论版本如何,它都能正常工作
答案 2 :(得分:1)
你需要添加一个带有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元素所针对的文件。