У нас есть общий файл .props в большом решении .NET (проект OSS), которое поставляет в основном библиотеки C# с некоторыми API-интерфейсами F#, созданными поверх них. Я хочу глобально установить версию C# через свойство LangVersion для использования C# 10.0 или 11.0, но когда я это делаю, это прерывает компиляцию моих проектов F#, которые также зависят от одного и того же файла .props.
Использование отдельных файлов .props для каждого — не лучший вариант, так как этот файл .props также отвечает за заполнение метаданных версии/пакета, и мы хотим хранить его в одном месте, чтобы исключить ошибки дублирующего типа.
Поэтому я пытаюсь использовать условное свойство внутри нашего файла .props, которое выглядит так:
<!-- Set the language version for C# if we're not inside an F# project -->
<PropertyGroup Condition = " '$(Language)' == 'CSharp' ">
<LangVersion>10.0</LangVersion>
</PropertyGroup>
Однако я не уверен, что правильная переменная/вывод должна проверить это. Я просмотрел списки, упомянутые в Список встроенных переменных MSBuild, и не смог найти его там.
Свойство Language задается Microsoft.<languageName>.targets, которое импортируется после Directory.Build.props и после файла проекта. Его можно использовать, но только в мишенях
Не проверено, но возможно:
Condition = " '$(MSBuildProjectExtension)' == '.csproj' "
Берем MSBuildProjectExtension из здесь
Это хорошая идея - я попробую
@Aaronontheweb отлично! Я мог бы использовать это сам несколько раз, но в конце концов я обычно обманываю и просто использую latest плюс global.json, который устанавливает минимальную версию SDK на то, что имеет языковую версию, которую я хочу
Для этой цели должно существовать свойство Language. Я знаю, что это делают C# и VB, и мы установили его в наборе инструментов WiX.
Я также использовал трюк для специфичных для языка .props, добавив следующее в конец Directory.Build.props
<Import Project = "Directory$(MSBuildProjectExtension).props"
Condition = " Exists('Directory$(MSBuildProjectExtension).props') " />
Затем я добавляю любое содержимое, специфичное для C#, в Directory.csproj.props рядом с Directory.Build.props по мере необходимости. Он довольно хорошо масштабируется.
Похоже, есть свойство Language, но я не могу сказать, попало ли оно в текущую версию MSBuild или каковы его значения github.com/dotnet/msbuild/issues/2101