我有一个包含多个项目的解决方案,其中一些引用NuGet软件包。有一个网站,但也必须为x86或x64构建服务。该服务是我目前正在尝试构建的。
我们正在参加TFS 2013;对于此特定解决方案,我使用的是Visual Studio 2015。
都选中了“允许NuGet下载丢失的程序包”和“在Visual Studio构建期间自动检查丢失的程序包”。
我正在运行NuGet 3.4.4,我已经更新到4.6.2。
我可以从Visual Studio构建良好。但是服务器上的自动构建失败了。但更重要的是,如果我尝试在本地运行MSBuild,它也会失败。类似于this question和this one。
据我所知,发行模板是正确的版本(12),但是我也不认为这是服务器问题,因为我也不能在本地构建。
这些软件包不在源代码管理中。
解决方案的根文件夹中有一个nuget.config
;它以前位于解决方案根目录下的.nuget
文件夹中。我没有(也从来没有)在nuget.exe
文件夹中有nuget.targets
或nuget
。这是配置:
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<packageSources>
<clear />
<add key="NuGetCache" value="\\BuildServer\NuGetPackages" />
<add key="NuGetV2" value="https://www.nuget.org/api/v2/" />
</packageSources>
<packageRestore>
<add key="enabled" value="True" />
<add key="automatic" value="True" />
</packageRestore>
<solution>
<add key="disableSourceControlIntegration" value="true"/>
</solution>
</configuration>
如果我(手动)清除软件包并运行
MSBuild /p:Configuration=Release;Platform=x64
(从VS2015命令提示符),它失败,因为它找不到所引用的软件包。
根据this answer中的建议,我从项目中删除了EnsureNuGetPackageBuildImports
个目标;他们没有RestorePackages
标签或nuget.targets
的导入。
我尝试添加一个预构建事件来还原软件包(是的,我知道这是“旧的”处理方式)
"C:\Program Files (x86)\NuGet\nuget.exe" restore -ConfigFile "$(SolutionDir)nuget.config" -PackagesDirectory "$(SolutionDir)packages"
...,但是始终失败(“命令以代码1退出”)。如果我从MSBuild输出中复制NuGet命令行并单独执行,则成功。
我注意到一个奇怪的事情:在预构建事件中,NuGet说:“文件夹d:\ path \ to \ solution \ project1 \ bin \ Release-x64不包含msbuild解决方案或packages.config文件,恢复”。我不确定为什么要在输出文件夹中寻找它们。
我确实有解决方法。我们设置了网络共享,以用作程序包缓存。如果我手动编辑项目文件并更改每个引用,以使HintPath
指向\\BuildServer\NuGetPackages\
而不是..\packages\
,则构建将成功。但这是丑陋的,更重要的是,它大大降低了Visual Studio的性能。