如何获得 .net 标准 2.0 项目以在 TFS2015 上构建

How do I get a .net standard 2.0 project to build on TFS2015

我在 .net 4.7.1 网络解决方案中有一个 .net 标准 2.0 class 库。

在本地构建解决方案工作正常,但当 TFS 服务器构建解决方案时,它无法编译 .net 2.0 标准库。它在编译期间崩溃并抱怨 system.object 等未定义或导入。

这是一个 TFS 2015 运行宁老 tfsbuild.proj 风格 xml 文件。 构建服务器是最新的 .net 4.7.1、最新的 .net core 2.0.3、最新的 visual studio、最新的构建工具。

我可以看到它生成了一个 csc.exe 命令来编译崩溃的 .net 标准 2.0 项目。如果我只是 运行 "dotnet build",效果很好。

查看构建日志,我可以看到在 VS 或 "dotnet build" 中 运行ning 时的 CoreCompile 步骤包含一个 "References" 任务参数,其中引用了 .net 标准 2图书馆。当构建服务器运行正在构建时,CoreCompile 步骤中缺少此任务参数。

有没有人建议如何最好地继续在 tfs 服务器上获取 msbuild 以成功编译 .net 标准 2.0 项目?

我可以让 msbuild 生成必要的 "References" 任务参数吗?

我最好的选择是关闭 .net 标准项目的自动构建并尝试使用 "dotnet build" 手动完成所有构建步骤,因为 dotnet build 正确识别了必要的引用?

您似乎正在尝试使用 VS2015 MSBuild 工具构建包含 .NET Standard 2.0 项目的解决方案。

The .NET team changed the project file structure (first announced here) for new .NET Core and .NET Standard projects along with the release of Visual Studio 2017.

构建 .NET Core/Standard 的支持随 TFS 2017 Update 2 更新而来。

.NET Core tasks support project files

With the current update, we are enhancing .NET core tasks to support *.csproj files in addition to project.json. You can now use Visual Studio 2017 on your build agents to build .NET core applications using csproj files.

作为解决方法,您可以尝试放弃使用 TFS 2015 构建任务 MSBUILD 和 Visual Studio 构建,现在使用 命令行步骤 。一般来说,如果您可以在命令行上执行任务,您也可以在 TFS/VSTS 中执行。更详细的步骤请参考这篇博客:Building .NET Core and .NET Standard Projects in TFS 2015

本周早些时候,我能够使用 vNext 构建系统获得一个针对 netstandard2.0+net452 的 class 库,以在 TFS 2015 更新 4 上构建。如果您能够 运行 PowerShell 或批处理脚本,这可能会使用 XAML 构建。

我不得不做一些@PatrickLu-MSFT 解释中没有提到的事情。

关键points/differences是

  1. 安装 TFS 2015 更新 2 是不够的。您还需要在构建服务器上安装正确的 VS 组件。我不得不 install/update VS 2017 Enterprise 15.6.x and VS 2017 Build tools 15.6.x 在构建服务器上。除了 3.5 和 4.0 之外,这两个都具有所有目标包。 Dotnet 核心是一个重要的选择,因为它似乎是 SDK 项目支持的来源,您可能需要使用 dotnet.exe.

  2. 运行 dotnet restore 而不是 nuget.exe (4.5) 或 msbuild (v15.6) 来恢复包。这两个需要一些 JSON 文件,但不能自己生成。对我来说,这是一个两行脚本;一个用于将位置设置为解决方案所在的位置,另一个用于调用还原。

之后就是调用与 VS 2017 一起安装的 msbuild,如 PatrickLu 的回答中所述。

此时解决方案应该可以编译,但是如果您之后需要对程序集执行其他操作,例如制作 PDB 或打包它,请注意这些潜在的问题...

  • nuget.exe pack 不明白如何找到 DLL 以正确制作 nuget 包。它一直在寻找 \release\any cpu\my.project\release\netstandard20\ 输出路径,但该路径未在该项目中定义。
  • VS 2017 可能会尝试将 \release\netstandard20 to release\netstandard20\netstandard20` 的输出路径加倍。
  • 对于解决方案中没有打包目标的每个项目,尝试将 /t:Pack 添加到现有 msbuild 调用失败,例如正在打包的程序集的单元测试。
  • MSFT docs pages 充满了一般信息,但缺少如何为 non-SDK 样式项目添加打包目标。覆盖它们的先前版本丢失了。
  • netstandard2.0 的默认“便携式”类型调试符号不能被内置 vnext 构建任务索引。
  • msbuild 不支持在所有配置的项目属性中选择“完整”调试符号类型。
  • 将完整符号的命令行选项指定给 msbuild,似乎可以生成可索引的符号,但我还没有尝试查看它们是否有效。