Utiliser les kits SDK de projet MSBuild

MSBuild 15.0 a introduit le concept de « SDK de projet », qui simplifie l’utilisation des kits de développement logiciel nécessitant l’importation de propriétés et de cibles.

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

Durant l’évaluation du projet, MSBuild ajoute des importations implicites au début et à la fin du fichier projet :

<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>

Référencer un kit SDK de projet

Il existe trois manières de référencer un kit SDK de projet :

Utiliser l’attribut Sdk sur l’élément <Project/>

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

Une importation implicite est ajoutée au début et à la fin du projet, comme expliqué précédemment.

Pour spécifier une version spécifique du SDK, ajoutez-la à l’attribut Sdk :

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

Utiliser l’élément <Sdk/> de niveau supérieur

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

Une importation implicite est ajoutée au début et à la fin du projet, comme expliqué précédemment.

L’attribut Version n’est pas nécessaire.

Utiliser l’élément <Import/> n’importe où dans votre projet

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

L’inclusion explicite des importations dans votre projet vous permet d’avoir un contrôle total de l’ordre.

Quand vous utilisez l’élément <Import/>, vous pouvez également spécifier un attribut Version facultatif. Par exemple, vous pouvez spécifier <Import Project="Sdk.props" Sdk="My.Custom.Sdk" Version="1.2.3" />.

Avertissement

Si vous changez le projet pour utiliser des éléments <Import/>, veillez à ajouter les importations .props et .targets, et à supprimer le SDK de l’élément <Project/> et des éléments <Sdk/>. Si vous ne le faites pas, vous obtenez des importations en double et un avertissement MSB4011.

Méthode de résolution des kits SDK de projet

Durant l’évaluation de l’importation, MSBuild résout dynamiquement le chemin du SDK de projet en fonction du nom et de la version que vous avez spécifiés. MSBuild a également la liste des programmes de résolution de SDK inscrits, qui sont des plug-ins qui localisent les SDK de projet sur votre machine. Ces plug-ins sont les suivants :

  • Un programme de résolution basé sur NuGet qui interroge vos flux de packages configurés pour localiser les packages NuGet qui correspondent à l’ID et à la version du kit SDK que vous avez spécifié.

    Ce programme de résolution est actif uniquement si vous avez spécifié une version facultative. Il peut être utilisé pour n’importe quel SDK de projet personnalisé.

  • Un programme de résolution de SDK .NET qui résout les SDK MSBuild installés avec le SDK .NET.

    Ce programme de résolution localise les SDK de projet comme Microsoft.NET.Sdk et Microsoft.NET.Sdk.Web qui font partie du produit.

  • Un programme de résolution par défaut qui résout les kits SDK installés avec MSBuild.

Le programme de résolution de SDK basé sur NuGet prend en charge la spécification d’une version dans le fichier global.json, ce qui vous permet de contrôler la version du SDK de projet à un seul endroit plutôt que dans chaque projet individuel :

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

Seule une version de chaque kit SDK de projet peut être utilisée durant une build. Si vous référencez deux versions différentes du même SDK de projet, MSBuild émet un avertissement. Nous vous recommandons de ne pas spécifier de version dans vos projets si une version est spécifiée dans le fichier global.json.