Visual Studio 2017 生成代理无法生成错误 cs0400

Visual Studio 2017 build agent fails to build with error cs0400

我已经安装了 VS 2017 Build 代理并将其注册到 'Default' 代理队列中。我要构建的项目是一个 VS 2017 class 库项目,目标是 .Net Standard 1.0。 从 Visual Studio 构建时,构建成功。但是构建代理上的构建失败。

T16:05:59.0389362Z ##[error]C:\Windows\ServiceProfiles\NetworkService\AppData\Local\Temp.NETStandard,Version=v1.0.AssemblyAttributes.cs(4,20): Error CS0400: The type or namespace name 'System' could not be found in the global namespace (are you missing an assembly reference?)

通过将构建日志与我的本地构建进行比较,我可以看到构建代理调用 csc.exe 时缺少 'reference' 属性。 我的项目没有任何明确的引用——它只需要 .NetStandard 1.0 库 (SDK)。 构建代理使用的命令行是:

\MSBuild.0\Bin\Roslyn\csc.exe /noconfig /unsafe- /checked- /nowarn:1701,1702,1705 /nostdlib+ /errorreport:prompt /warn:4 /define:TRACE;RELEASE;NETSTANDARD1_0 /debug- /debug:portable /filealign:512 /nologo /optimize+ /out:obj\Release\netstandard1.0\Geo.Common.dll /ruleset:"C:\Program Files (x86)\Microsoft Visual Studio17\Professional\Team Tools\Static Analysis Tools\Rule Sets\MinimumRecommendedRules.ruleset" /target:library /warnaserror- /utf8output /deterministic+ Distance.cs DistanceExtensions.cs GeoCoordinate.cs Unit.cs "C:\Windows\ServiceProfiles\NetworkService\AppData\Local\Temp.NETStandard,Version=v1.0.AssemblyAttributes.cs" obj\Release\netstandard1.0\Geo.Common.AssemblyInfo.cs

我知道我可以将 'reference' 列表作为命令行属性硬编码到构建定义中的构建步骤,但这是一种解决方法。 解决此问题的正确方法是什么?

谢谢!

更新 原来失败的原因是构建定义中的较早步骤 NuGet Restore 使用的是 nuget.exe[=35 的 3.5 版本=].因为项目文件是 VS 2017 格式,nuget.exe 无法找到任何引用的包,所以在没有实际拉入任何东西的情况下成功完成。因此,在下一步中,构建失败,因为没有找到 NuGet 包(因此没有找到任何程序集)

解决方案

我下载了nuget.exe 4.0(找到here)并将其放在代理的工作目录(D:\VsAgentWork\nuget.exe中我的情况)。然后,我自定义了 NuGet 还原步骤,以从提供的位置引用 nuget.exe (...\nuget.exe).

您需要为您的解决方案恢复包。对于 .NET Core,您需要使用 dotnet cli 或 MSBuild /t:restore 目标执行此操作,或者您可以从 nuget 站点下载 NuGet 4 并将其放在您的构建机器上,并在 NuGet 安装程序的路径中指定它任务。

我在 VS2017 上也遇到过这个问题,这似乎是一个错误。

首先只是重启 VS,但我确实发现有时需要完整的步骤来解决问题:

  1. 关闭VS
  2. 删除 .vs/ 文件夹
  3. 删除任何 bin/obj/ 文件夹
  4. 重新加载 VS 并运行重建

有这个完全相同的问题,并从

切换
nuget restore xyz.sln

dotnet restore
nuget restore xyz.sln

在构建本身修复它之前。

如果你想为你的 .net 核心应用程序使用托管的 VS2017 代理池,你可以 运行 'dotnet restore',这也应该有效:https://www.visualstudio.com/en-us/docs/build/apps/aspnet/ci/build-aspnet-core