Compartir a través de


Usar 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 atributo Sdk 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 Información general sobre el SDK de proyecto de .NET.

Referencia a un SDK de proyecto

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

Use el atributo Sdk en el elemento <Project/>

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

Una importación implícita se agrega a la parte superior e inferior del proyecto, como se ha explicado antes.

Para especificar una versión concreta del SDK, anéxela al atributo Sdk:

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

Use el elemento <Sdk/> de nivel superior

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

Una importación implícita se agrega a la parte superior e inferior del proyecto, como se ha explicado antes.

El atributo Version no es necesario.

Use el elemento <Import/> en cualquier parte de su 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 de manera explícita las importaciones en el proyecto, podrá ejercer un control total sobre el orden.

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

Advertencia

Si cambia el proyecto para que use <Import/> elementos, asegúrese de agregar .props e .targets importaciones 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 advertencia MSB4011.

Resolución de SDK de proyecto

Al evaluar la importación, MSBuild resuelve de forma dinámica la ruta de acceso al SDK del proyecto en función del nombre y la versión especificados. MSBuild también tiene una lista de solucionadores de SDK registrados, que son complementos que ubican los SDK de proyecto en el equipo. Entre estos complementos se incluyen los siguientes:

  • Una resolución basada en NuGet que consulta las fuentes de paquetes configuradas para los paquetes NuGet que coinciden con el identificador y la versión del SDK especificado.

    Este solucionador solo está activo si ha especificado una versión opcional. Se puede usar para cualquier SDK de proyecto personalizado.

  • Un solucionador del SDK de .NET que resuelve los SDK de MSBuild que se instalan con el SDK de .NET.

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

  • Una resolución predeterminada 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 su archivo global.json, lo que permite controlar la versión del SDK de proyecto en un solo lugar y no en cada proyecto individual:

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

Durante una compilación, solo se puede usar una versión de cada SDK de proyecto. 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 ha especificado una versión en el archivo global.json.