Como usar SDKs de projeto do MSBuild

MSBuild 15,0 introduziu o conceito do "SDK do projeto", que simplifica o uso de kits de desenvolvimento de software que exigem propriedades e destinos a serem importados.

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

durante a avaliação do projeto, MSBuild adiciona importações implícitas na parte superior e inferior do arquivo de projeto:

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

Referenciar um SDK de projeto

Há três maneiras de referenciar um SDK de projeto:

  • Use o atributo Sdk no elemento <Project/>:

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

    Uma importação implícita é adicionada à parte superior e inferior do projeto, conforme discutido anteriormente.

    Para especificar uma versão específica do SDK, acrescente-a ao Sdk atributo:

    <Project Sdk="My.Custom.Sdk/1.2.3">
        ...
    </Project>
    
  • Use o elemento <Sdk/> de nível superior:

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

    Uma importação implícita é adicionada à parte superior e inferior do projeto, conforme discutido anteriormente.

    O atributo Version não é necessário.

  • Use o elemento <Import/> em qualquer lugar no projeto:

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

    Incluir explicitamente as importações no projeto permite que você tenha controle total sobre a ordem.

    Ao usar o elemento <Import/>, você também pode especificar um atributo Version opcional. Por exemplo, você pode especificar <Import Project="Sdk.props" Sdk="My.Custom.Sdk" Version="1.2.3" />.

Como os SDKs de projeto são resolvidos

ao avaliar a importação, MSBuild resolve dinamicamente o caminho para o SDK do projeto com base no nome e na versão que você especificou. MSBuild também tem uma lista de resolvedores de SDK registrados, que são plug-ins que localizam SDKs de projeto em seu computador. Os plug-ins incluem:

  • Um resolvedor baseado em NuGet que consulta os feeds de pacotes configurados para pacotes do NuGet que correspondem à ID e à versão do SDK que você especificou.

    Esse resolvedor só estará ativo se você tiver especificado uma versão opcional. Ele pode ser usado para qualquer SDK do projeto personalizado.

  • um resolvedor do sdk do .net que resolve MSBuild SDKs instalados com o SDK do .net.

    Esse resolvedor localiza SDKs de projeto como Microsoft.NET.Sdk e Microsoft.NET.Sdk.Web que fazem parte do produto.

  • Um resolvedor padrão que resolve SDKs instalados com o MSBuild.

o resolvedor de SDK baseado em NuGet dá suporte à especificação de uma versão no arquivo global. json , que permite controlar a versão do SDK do projeto em um único lugar em vez de em cada projeto individual:

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

Somente uma versão de cada SDK de projeto pode ser usada durante uma compilação. se você fizer referência a duas versões diferentes do mesmo SDK do projeto, MSBuild emitirá um aviso. É recomendável não especificar uma versão em seus projetos se uma versão for especificada no arquivo global. JSON .

Confira também