我有一个由多个项目组成的解决方案,其中一些项目引用了NuGet包 . 有一个网站,但也有一个必须为x86或x64构建的服务;这项服务是我目前正在努力 Build 的 .

我们're on TFS 2013; for this particular solution, I' m使用Visual Studio 2015. "Allow NuGet to download missing packages"和"Automatically check for missing packages during Visual Studio build"都被选中 .
我正在运行NuGet 3.4.4,我已经更新到4.6.2 .

我可以从Visual Studio中构建好 . 但是服务器上的自动构建失败了;但更重要的是,如果我尝试在本地运行MSBuild,它也会失败 . 与this questionthis one相似 .

据我所知,发布模板是正确的版本(12),但我认为这不是服务器问题,因为我无法在本地构建 .

包不在源代码管理中 .
我在解决方案根文件夹中有 nuget.config ;它以前位于解决方案根目录下的 .nuget 文件夹中 . 我没有(并且从未这样做)在 nuget 文件夹中有 nuget.exenuget.targets . 这是配置:

<?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的性能 .