【问题标题】:How do I set csc langversion when building in VSTS?在 VSTS 中构建时如何设置 csc langversion?
【发布时间】:2018-06-11 13:14:15
【问题描述】:

我有一个简单的测试控制台应用程序。它唯一的代码是

public class Class1
{
    private protected int _value = 0b_1001_0110;
}

这只是为了测试这些 C# 7.2 功能是否会构建。

在 Visual Studio 2017 15.5.2 中,如果我这样设置语言版本,它们构建得很好

如果我现在将项目签入 VSTS 并运行构建,它会因各种错误而失败,例如

Test\CSharp72Test\CSharp72Test\Class1.cs(7,17):错误 CS0107:更多 不止一个保护修饰符
Test\CSharp72Test\CSharp72Test\Class1.cs(7,40):错误 CS1013:无效 编号

因为它对 C#7 一无所知。

如果我现在添加“Microsoft.NET.Compilers 2.6.1”NuGet 包并重建它在本地工作正常,但在 VSTS 中失败

Test\CSharp72Test\CSharp72Test\Class1.cs(7,40):错误 CS8107:功能 “前导数字分隔符”在 C# 7.0 中不可用。请用 语言版本 7.2 或更高版本。

它现在使用的是正确版本的 CSC.exe,但没有通过 /langversion:latest。

如何在多项目解决方案中正确传递每个项目

【问题讨论】:

  • 您是使用托管构建队列还是管理自己的构建队列?听起来您的构建代理没有安装 VS 2017 更新。
  • 托管的。如果设置了语言版本,则使用 NuGet 编译器包将起作用。
  • 在一个构建代理机器上,可以有多个MSBuild版本,blog.lextudio.com/the-rough-history-of-msbuild-cc72a217fa98所以仅仅在你的项目文件中设置语言版本是没有用的,你必须将构建代理(你的管道定义)配置为选择正确的 MSBuild 版本。我为 Obfuscar 所做的是调用适当的 PowerShell cmdlet 来帮助github.com/obfuscar/obfuscar/blob/master/release.ps1

标签: c# tfs azure-devops azure-pipelines csc


【解决方案1】:

Visual Studio 构建任务也在调用MSBuild.exe 命令来运行构建。

您可以直接通过MSBuild Argument在本地通过命令行构建成功,如下所示:

msbuild "C:\Users\Admin\Source\repos\ClassLibrary2\ClassLibrary2\ClassLibrary2.csproj" /property:langversion=latest 

所以你只需要在VSTS的Visual Studio Build任务的MsBuild Argument中添加/property:langversion=latest或者直接在项目文件中将<LangVersion>xx</LangVersion>的值改为latest即可。

但是,根据VSTS Hosted VS2017 image,主机代理只安装了 Visual Studio 2017 Enterprise * 版本:15.4.0

C# 7.2 ships with the 15.5 release of Visual Studio 2017.

也出现了相关的用户声音:Hosted agent with VS 15.5 to enable C# 7.2 support

作为一种解决方法,您可以设置您的所有者构建代理并安装 Visual Studio 2017 15.5.2。

【讨论】:

  • 1) 在高级构建设置中设置语言版本会更新项目文件。 2) 问题是使用 VS 构建时使用了 的语言版本,但 MSBuild 不使用 。因此更新托管版本不会解决问题,因为 CSC.exe 默认使用 langversion:default,它等于 C#7.0。我认为这是一个错误。我将针对 nuget.org/packages/Microsoft.Net.Compilers 创建一个问题,它具有相同的问题。
  • 仅供参考,将近一年半之后,这似乎仍然是 Azure DevOps 构建中的一个问题。我尝试在 DevOps 构建中添加 /property:langversion=latest 参数,但它对我大喊大叫 Error CS1617: Invalid option 'latest' for /langversion; must be ISO-1, ISO-2, Default or an integer in range 1 to 6.
【解决方案2】:

您需要将语言版本设置为C# latest minor version (latest)对于所有构建配置而不仅仅是Debug。请参阅here 了解如何操作。

  • 右击YourProject,点击Properties

  • 如果尚未选中,请单击Build

  • Configuration 更改为All Configurations

  • 点击Advanced...

  • 更改语言版本

【讨论】:

    猜你喜欢
    • 2018-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-27
    相关资源
    最近更新 更多