一个NuGet包(SQLite Core)导致TFS构建失败

4
我的解决方案已配置为“还原包”,但其中一个项目无法构建:-
3>C:\Builds\1\xxxxx\xxxx.csproj(223,5): error : 此项目引用了在此计算机上缺失的NuGet包。启用NuGet包还原以下载它们。有关更多信息,请参见http://go.microsoft.com/fwlink/?LinkID=322105。缺少的文件是..\packages\System.Data.SQLite.Core.1.0.97.0\build\net45\System.Data.SQLite.Core.targets。
上面的错误可能是个误导,因为它出现在包还原之前,即
2> RestorePackages: 正在还原NuGet包...
在有问题的项目的.csproj文件末尾附近有这个部分,似乎生成了上述错误:-
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<Import Project="$(SolutionDir)\.nuget\nuget.targets" />
<Import Project="..\packages\System.Data.SQLite.Core.1.0.97.0\build\net45\System.Data.SQLite.Core.targets" Condition="Exists('..\packages\System.Data.SQLite.Core.1.0.97.0\build\net45\System.Data.SQLite.Core.targets')" />

<Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">
  <PropertyGroup>
    <ErrorText>This project references NuGet package(s) that are missing on this computer. Enable NuGet Package Restore to download them.  For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}.</ErrorText>
  </PropertyGroup>
  <Error Condition="!Exists('..\packages\System.Data.SQLite.Core.1.0.97.0\build\net45\System.Data.SQLite.Core.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\System.Data.SQLite.Core.1.0.97.0\build\net45\System.Data.SQLite.Core.targets'))" />
</Target>

发生了什么?我是否正确地假设在解决方案的软件包恢复之前就进行了此检查(因此失败了)?我该如何解决这个问题?

在解决方案中的其他项目(不引用SQLite核心包的项目)可以成功恢复其软件包,并构建成功。

2个回答

5
我发现这与你在构建过程中恢复丢失的NuGet包所使用的方法有关。我正在使用众所周知的“启用NuGet包还原”选项(通过右键单击解决方案)。问题在于,所涉及的NuGet包(“System.Data.SQLite Core(x86 / x64)”)添加了一个预构建步骤(早期元素),该步骤检查此包是否安装了名为System.Data.SQLite.Core.targets的构建目标文件。
这让人想起先有鸡还是先有蛋 - 包还没有被恢复,但预构建步骤正在检查包的文件是否存在!
现在恢复NuGet包的推荐方法似乎是较新的“自动包恢复”功能。我的理解是,在构建开始之前,它会恢复NuGet包,避免出现上述问题。不幸的是,TFS 2012不支持此功能。有一个解决方法(详见此处),其中涉及在解决方案中创建一个msbuild项目文件,负责在继续构建解决方案之前恢复NuGet包,但这开始感觉混乱。
对于任何有兴趣的人(或熟悉SQLite.Net的人),这就是我解决问题的方法:-
我删除了“System.Data.SQLite Core(x86 / x64)”软件包,并添加了软件包“System.Data.SQLite Core MSIL”。这仅包含托管的System.Data.SQLite.dll程序集,并且不会使用自定义构建目标做任何聪明的事情。
这个程序集依赖于本地的SQLite.Interop.dll,但由于某种奇怪的原因,它被设计为在[bin]\x86或[bin]\x64子文件夹中查找(取决于体系结构)。这些互操作DLL是原始软件包的一部分,我已经删除了它; 它的构建目标(导致我的问题)负责将DLL复制到这些子文件夹中。 为了解决这个问题,我向我的项目添加了x86和x64互操作DLL,就像这样:-
FooProject
  \x86
     SQLite.Interop.dll
  \x864
     SQLite.Interop.dll

我确保它们的构建操作是“内容”,然后将它们的复制到输出目录设置更改为“始终复制”。当“内容”文件被复制到输出文件夹时,项目文件夹结构得以保留,因此这是创建[bin]\x86和[bin]\x64子文件夹及其各自的DLL文件的方便方式。


0
在我的情况下,我检查了.csproj文件中的位置是否有System.Data.SQLite.Core.targets文件,然后我重新启动了计算机和Visual Studio,然后成功构建而没有错误。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接