Поделиться через


Использование пакетов SDK для проекта MSBuild

Вы можете ссылаться на всю инфраструктуру сборки, необходимую для стека технологий разработки, например пакет SDK для .NET, просто ссылаясь на набор свойств и целевых объектов, которые коллективно называются пакетом SDK для проекта по определенному идентификатору. Идентификатор ссылается на определенный .props набор файлов, содержащих определения свойств и .targets файлы, содержащие определения целевых объектов. Вы ссылаетесь на пакет SDK проекта с помощью Sdk атрибута на узле проекта верхнего уровня.

<Project Sdk="Microsoft.NET.Sdk">
    <PropertyGroup>
        <TargetFramework>net46</TargetFramework>
    </PropertyGroup>
</Project>

Во время оценки проекта MSBuild добавляет неявные импорты в верхней и нижней части файла проекта:

<Project>
    <!-- Implicit top import -->
    <Import Project="Sdk.props" Sdk="Microsoft.NET.Sdk" />

    <PropertyGroup>
        <TargetFramework>net46</TargetFramework>
    </PropertyGroup>

    <!-- Implicit bottom import -->
    <Import Project="Sdk.targets" Sdk="Microsoft.NET.Sdk" />
</Project>

Существует множество пакетов SDK, распределенных корпорацией Майкрософт. Пакет SDK для проекта, на который ссылается в предыдущем примере, имеет моникер Microsoft.NET.Sdk. Пакеты SDK проекта, связанные с .NET Core и .NET 5 и более поздних версий, перечислены в обзоре пакета SDK для проектов .NET.

Ссылка на пакет SDK для проекта

Существует три способа ссылки на пакет SDK для проекта:

Использование атрибута Sdk в элементе Project

<Project Sdk="My.Custom.Sdk">
    ...
</Project>

Неявный импорт добавляется в верхнюю и нижнюю часть проекта, как описано ранее.

Чтобы указать определенную версию пакета SDK, добавьте его в Sdk атрибут:

<Project Sdk="My.Custom.Sdk/1.2.3">
    ...
</Project>

Использование элемента верхнего уровня Sdk

<Project>
    <Sdk Name="My.Custom.Sdk" Version="1.2.3" />
    ...
</Project>

Неявный импорт добавляется в верхнюю и нижнюю часть проекта, как описано ранее.

Атрибут Version не требуется.

Используйте элемент Import в любом месте вашего проекта

<Project>
    <PropertyGroup>
        <MyProperty>Value</MyProperty>
    </PropertyGroup>
    <Import Project="Sdk.props" Sdk="My.Custom.Sdk" />
    ...
    <Import Project="Sdk.targets" Sdk="My.Custom.Sdk" />
</Project>

При явном включении импорта в проект у вас есть полный контроль над заказом.

При использовании Import элемента можно также указать необязательный Version атрибут. Например, можно указать <Import Project="Sdk.props" Sdk="My.Custom.Sdk" Version="1.2.3" />.

Предупреждение

Если вы измените проект на использование Import элементов, убедитесь, что вы добавляете как .props, так и .targets, и удаляете SDK из Project элемента и Sdk элементов. Невыполнение этого приведет к дублированию импорта и предупреждению MSB4011.

Разрешение пакетов SDK для проекта

При оценке импорта MSBuild динамически разрешает путь к пакету SDK проекта на основе указанного имени и версии. MSBuild также содержит список зарегистрированных сопоставителей SDK, которые являются модулями, находящими пакеты SDK для проектов на вашем компьютере. Эти подключаемые модули включают:

  • Сопоставитель на основе NuGet, который запрашивает настроенные источники пакетов для пакетов NuGet, соответствующих указанному вами идентификатору и версии SDK.

    Этот резолвер активен только при указании дополнительной версии. Его можно использовать для любого пользовательского пакета SDK проекта.

  • Сопоставитель пакета SDK для .NET, который разрешает пакеты SDK MSBuild, установленные с помощью пакета SDK для .NET.

    Этот сопоставитель находит пакеты SDK для проекта, такие как Microsoft.NET.Sdk и Microsoft.NET.Sdk.Web которые являются частью продукта.

  • Сопоставитель по умолчанию, определяющий SDK, установленные с помощью MSBuild.

Сопоставитель пакета SDK на основе NuGet поддерживает указание версии в файлеglobal.json , что позволяет управлять версией пакета SDK для проекта в одном месте, а не в каждом отдельном проекте:

{
    "msbuild-sdks": {
        "My.Custom.Sdk": "5.0.0",
        "My.Other.Sdk": "1.0.0-beta"
    }
}

Во время сборки можно использовать только одну версию каждого пакета SDK для проекта. Если вы ссылаетесь на две разные версии одного пакета SDK для проекта, MSBuild выдает предупреждение. Рекомендуется не указывать версию в проектах, если в файле global.json указана версия.