MSBuild: как определить язык проекта (C# или F#) в переменной/функции MSBuild?

У нас есть общий файл .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, но я не могу сказать, попало ли оно в текущую версию MSBuild или каковы его значения github.com/dotnet/msbuild/issues/2101

Aaronontheweb 22.02.2023 17:01

Свойство Language задается Microsoft.<languageName>.targets, которое импортируется после Directory.Build.props и после файла проекта. Его можно использовать, но только в мишенях

JL0PD 23.02.2023 02:42
Запуск PHP на IIS без использования программы установки веб-платформы
Запуск PHP на IIS без использования программы установки веб-платформы
Установщик веб-платформы, предлагаемый компанией Microsoft, перестанет работать 31 декабря 2022 года. Его закрытие привело к тому, что мы не можем...
Оптимизация React Context шаг за шагом в 4 примерах
Оптимизация React Context шаг за шагом в 4 примерах
При использовании компонентов React в сочетании с Context вы можете оптимизировать рендеринг, обернув ваш компонент React в React.memo сразу после...
Библиотека для работы с мороженым
Библиотека для работы с мороженым
Лично я попрощался с операторами print() в python. Без шуток.
Настройка шаблона Metronic с помощью Webpack и Gulp
Настройка шаблона Metronic с помощью Webpack и Gulp
Я пишу эту статью, чтобы поделиться тем, как настроить макет Metronic с помощью Sass, поскольку Metronic предоставляет так много документации, и они...
Уроки CSS 6
Уроки CSS 6
Здравствуйте дорогие читатели, я Ферди Сефа Дюзгюн, сегодня мы продолжим с вами уроки css. Сегодня мы снова продолжим с так называемых классов.
Что такое Css? Для чего он используется?
Что такое Css? Для чего он используется?
CSS, или "Каскадные таблицы стилей", - это язык стилей, используемый в веб-страницах. CSS является одним из основных инструментов веб-разработки...
1
2
72
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Не проверено, но возможно:

Condition = " '$(MSBuildProjectExtension)' == '.csproj' "

Берем MSBuildProjectExtension из здесь

Это хорошая идея - я попробую

Aaronontheweb 22.02.2023 17:08

@Aaronontheweb отлично! Я мог бы использовать это сам несколько раз, но в конце концов я обычно обманываю и просто использую latest плюс global.json, который устанавливает минимальную версию SDK на то, что имеет языковую версию, которую я хочу

Marc Gravell 22.02.2023 17:36

Для этой цели должно существовать свойство 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 по мере необходимости. Он довольно хорошо масштабируется.

Другие вопросы по теме