Compartir a través de


Uso de SDK de proyecto de MSBuild

Puede hacer referencia a toda la infraestructura de compilación necesaria para una pila de tecnología de desarrollo, como el SDK de .NET, simplemente haciendo referencia a un conjunto de propiedades y destinos conocidos colectivamente como SDK de proyecto por su identificador específico. El identificador hace referencia a un conjunto determinado de archivos .props que contienen definiciones de propiedad y archivos .targets que contienen definiciones de destino. Se hace referencia a un SDK de proyecto mediante el Sdk atributo en el nodo de proyecto de nivel superior.

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

Durante la evaluación del proyecto, MSBuild agrega importaciones implícitas en la parte superior e inferior del archivo del proyecto:

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

Hay muchos SDK distribuidos por Microsoft. El SDK del proyecto al que se hace referencia en el ejemplo anterior tiene el moniker Microsoft.NET.Sdk. Los SDK de proyecto asociados a .NET Core y .NET 5 y versiones posteriores se enumeran en La introducción al SDK de proyectos de .NET.

Referencia a un SDK de proyecto

Hay tres maneras de hacer referencia a un SDK de proyecto:

Uso del Sdk atributo en el Project elemento

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

Se agrega una importación implícita a la parte superior e inferior del proyecto, como se explicó anteriormente.

Para especificar una versión específica del SDK, anexe al Sdk atributo :

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

Utilice el elemento de nivel superior Sdk

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

Se agrega una importación implícita a la parte superior e inferior del proyecto, como se explicó anteriormente.

El atributo Version no es necesario.

Usa el Import elemento en cualquier parte del proyecto

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

Al incluir explícitamente las importaciones en el proyecto, tiene control total sobre el pedido.

Al usar el Import elemento , también puede especificar un atributo opcional Version . Por ejemplo, puede especificar <Import Project="Sdk.props" Sdk="My.Custom.Sdk" Version="1.2.3" />.

Advertencia

Si cambia el proyecto para que use elementos Import, asegúrese de agregar las importaciones .props y .targets y de quitar el SDK del elemento Project y los elementos Sdk. Si no lo hace, se duplicarán las importaciones y se generará una MSB4011 advertencia.

Cómo se resuelven los SDK de proyecto

Al evaluar la importación, MSBuild resuelve dinámicamente la ruta de acceso al SDK del proyecto en función del nombre y la versión que especificó. MSBuild también tiene una lista de solucionadores de SDK registrados, que son complementos que buscan SDK de proyecto en la máquina. Estos complementos incluyen:

  • Solucionador basado en NuGet que consulta las fuentes de paquetes configuradas para paquetes NuGet que coinciden con el identificador y la versión del SDK que especificó.

    Esta resolución solo está activa si especificó una versión opcional. Se puede usar para cualquier SDK de proyecto personalizado.

  • Resolución del SDK de .NET que resuelve los SDK de MSBuild que se instalan con el SDK de .NET.

    Este solucionador localiza los SDK de proyecto, como Microsoft.NET.Sdk y Microsoft.NET.Sdk.Web que forman parte del producto.

  • Solucionador predeterminado que resuelve los SDK que se instalaron con MSBuild.

El solucionador del SDK basado en NuGet admite la especificación de una versión en el archivo global.json , que permite controlar la versión del SDK del proyecto en un solo lugar en lugar de en cada proyecto individual:

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

Solo se puede usar una versión de cada SDK de proyecto durante una compilación. Si hace referencia a dos versiones diferentes del mismo SDK de proyecto, MSBuild emite una advertencia. Se recomienda no especificar una versión en los proyectos si se especifica una versión en el archivo global.json .