Usare SDK di progetto MSBuild

MSBuild 15.0 ha introdotto il concetto di "project SDK", che semplifica l'uso di software development kit che richiedono l'importazione di proprietà e destinazioni.

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

Durante la valutazione del progetto, MSBuild aggiunge importazioni implicite nella parte superiore e inferiore del file di progetto:

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

Fare riferimento a un SDK di progetto

Esistono tre modi per fare riferimento a un SDK di progetto:

Usare l'attributo Sdk nell'elemento <Project/>

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

Un'importazione implicita viene aggiunta alla parte superiore e inferiore del progetto, come illustrato in precedenza.

Per specificare una versione specifica dell'SDK, aggiungerla all'attributo Sdk :

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

Usare l'elemento di primo livello <Sdk/>

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

Un'importazione implicita viene aggiunta alla parte superiore e inferiore del progetto, come illustrato in precedenza.

L'attributo Version non è obbligatorio.

Usare l'elemento <Import/> in qualsiasi punto del progetto

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

L'inclusione esplicita delle importazioni nel progetto consente il controllo completo sull'ordine.

Quando si usa l'elemento <Import/> è possibile specificare anche un attributo Version facoltativo. Ad esempio, è possibile specificare <Import Project="Sdk.props" Sdk="My.Custom.Sdk" Version="1.2.3" />.

Avviso

Se si modifica il progetto in modo da usare <Import/> gli elementi, assicurarsi di aggiungere e .targets.props importare e rimuovere l'SDK dall'elemento <Project/> e <Sdk/> dagli elementi. In caso contrario, verranno generate importazioni raddoppiate e un MSB4011 avviso.

Come vengono risolti gli SDK di progetto

Quando si valuta l'importazione, MSBuild risolve in modo dinamico il percorso dell'SDK del progetto in base al nome e alla versione specificati. MSBuild include anche un elenco di resolver SDK registrati, che sono plug-in che individuano gli SDK di progetto nel computer. Questi plug-in includono:

  • Un resolver basato su NuGet che recupera i feed di pacchetto configurati per i pacchetti NuGet corrispondenti all'ID e alla versione dell'SDK specificati.

    Questo sistema di risoluzione è attivo solo se è stata specificata una versione facoltativa. Può essere usato per qualsiasi SDK di progetto personalizzato.

  • Un resolver .NET SDK che risolve gli SDK di MSBuild installati con .NET SDK.

    Questo sistema di risoluzione individua gli SDK del progetto, ad Microsoft.NET.Sdk esempio e Microsoft.NET.Sdk.Web che fanno parte del prodotto.

  • Un resolver predefinito che risolve gli SDK che sono stati installati con MSBuild.

Il resolver SDK basato su NuGet supporta la specifica di una versione nel file global.json , che consente di controllare la versione dell'SDK del progetto in un'unica posizione anziché in ogni singolo progetto:

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

Durante una compilazione, è possibile usare una sola versione di ogni SDK di progetto. Se si fa riferimento a due versioni diverse dello stesso SDK del progetto, MSBuild genera un avviso. È consigliabile non specificare una versione nei progetti se nel file global.json è specificata una versione.