Как установить csc langversion при сборке в VSTS?

У меня есть простое тестовое консольное приложение. Единственный код, который у него есть, это

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

который просто проверяет, будут ли эти функции С# 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.

Если я сейчас добавлю пакет NuGet «Microsoft.NET.Compilers 2.6.1» и пересоберу его, он отлично работает локально, но не работает в VSTS с

Test\CSharp72Test\CSharp72Test\Class1.cs(7,40): ошибка CS8107: функция "разделитель первых цифр" недоступна в C# 7.0. Пожалуйста, используйте языковую версию 7.2 или выше.

Теперь он использует правильную версию CSC.exe, но не передает /langversion:latest.

Как правильно передать это значение для каждого проекта в многопроектном решении?


person Phil    schedule 01.01.2018    source источник
comment
Используете ли вы размещенную очередь сборки или управляете своей собственной очередью сборки? Похоже, что у вашего агента(ов) сборки не установлены обновления VS 2017.   -  person tj-cappelletti    schedule 01.01.2018
comment
Хостинговый. Использование пакета компилятора NuGet будет работать, если установлена ​​langversion.   -  person Phil    schedule 01.01.2018
comment
На компьютере с агентом сборки может быть несколько версий MSBuild, blog.lextudio .com/the-rough-history-of-msbuild-cc72a217fa98 Таким образом, простая настройка языковой версии в файле проекта бесполезна, и вы должны настроить агент сборки (ваше определение конвейера), чтобы подобрать правильный правильный Версия MSBuild. Что я сделал для Obfuscar, так это вызвал соответствующий командлет PowerShell, чтобы помочь github.com/ obfuscar/obfuscar/blob/master/release.ps1   -  person Lex Li    schedule 27.09.2018


Ответы (2)


Задача сборки Visual Studio также вызывает команду MSBuild.exe для запуска сборки.

Вы можете напрямую передать аргумент MSBuild и успешно выполнить сборку через командную строку локально, как показано ниже:

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

Поэтому вам просто нужно добавить /property:langversion=latest в аргумент MsBuild задачи сборки Visual Studio в VSTS или напрямую изменить значение <LangVersion>xx</LangVersion> на самое последнее в файле проекта.

Однако согласно < strong>Размещенный VSTS образ VS2017, на хост-агенте установлена ​​только Visual Studio 2017 Enterprise * Версия: 15.4.0.

C# 7.2 поставляется с выпуск 15.5 Visual Studio 2017.

Также был связанный голос пользователя: Размещенный агент с VS 15.5 для включения поддержки C# 7.2

В качестве обходного пути вы можете настроить агент сборки владельца и установить Visual Studio 2017 15.5.2.

person PatrickLu-MSFT    schedule 02.01.2018
comment
1) Установка языковой версии в расширенных настройках сборки обновляет файл проекта. 2) Проблема в том, что языковая версия используется при сборке с помощью VS, но не используется MSBuild. Таким образом, обновление размещенной версии не решит проблему, поскольку CSC.exe по умолчанию использует langversion:default, что равно C#7.0. Я думаю, это ошибка. Я создам задачу для nuget.org/packages/Microsoft.Net.Compilers, у которого такая же проблема. - person Phil; 02.01.2018
comment
Задача создана здесь github.com/dotnet/roslyn/issues/24000#issuecomment-354882800 - person Phil; 04.01.2018
comment
К вашему сведению, почти полтора года спустя это все еще кажется проблемой в сборках Azure DevOps. Я пытался добавить аргумент /property:langversion=latest в сборку DevOps, но он кричал на меня Error CS1617: Invalid option 'latest' for /langversion; must be ISO-1, ISO-2, Default or an integer in range 1 to 6. - person eidylon; 15.07.2019

Вам нужно установить языковую версию C# latest minor version (latest) для всех конфигураций сборки, а не только Debug. См. здесь, чтобы узнать, как это сделать.

  • Щелкните правой кнопкой мыши YourProject, выберите Properties

  • Нажмите Build, если он еще не выбран.

  • Изменить Configuration на All Configurations

  • Нажмите Advanced...

  • Изменить языковую версию

person ta.speot.is    schedule 26.09.2018