Leer en inglés

Compartir vía


MSBuild

Microsoft Build Engine es una plataforma para compilar aplicaciones. Este motor, que también se conoce como MSBuild, proporciona un esquema XML para un archivo de proyecto que controla cómo procesa y compila software la plataforma de compilación. Visual Studio usa MSBuild, pero MSBuild no depende de Visual Studio. Al invocar msbuild.exe o dotnet build en el archivo de proyecto o solución, puede orquestar y compilar productos en entornos en los que Visual Studio no está instalado.

Visual Studio usa MSBuild para cargar y compilar proyectos administrados. Los archivos de proyecto de Visual Studio (.csproj, .vbproj, .vcxprojy otros) contienen código XML de MSBuild que se ejecuta al compilar un proyecto en el IDE. Los proyectos de Visual Studio importan todos los procesos de configuración y compilación necesarios para realizar un trabajo de desarrollo típico, pero puede ampliarlos o modificarlos desde Visual Studio o mediante un editor de texto.

Para instalar MSBuild en un sistema Windows que no tiene Visual Studio, vaya a Herramientas de compilación para Visual Studio en la página de descargas. La instalación de MSBuild mediante este método le proporciona MSBuild.exe.

Para .NET Core y .NET 5 o posterior, otra manera de obtener el equivalente a MSBuild es instalar el SDK de .NET . El comando de compilación de .NET dotnet build está disponible con el SDK de .NET en macOS, Windows o Linux. El comando de compilación de .NET dotnet build es una capa delgada sobre la versión de .NET Core de MSBuild.exe. Puede usar la interfaz de línea de comandos (CLI) de .NET Core , que usa MSBuild, para compilar proyectos que se dirigen a .NET Core y .NET 5 y versiones posteriores.

A partir de Visual Studio 2022, al compilar en Visual Studio, se usa la versión de 64 bits de MSBuild.

Para obtener información sobre MSBuild para C++, vea MSBuild (C++).

En los ejemplos siguientes se muestra cuándo puede ejecutar compilaciones invocando MSBuild desde la línea de comandos en lugar del IDE de Visual Studio.

  • Visual Studio no está instalado.

  • Quiere usar la versión de 64 bits de MSBuild y usa Visual Studio 2019 o versiones anteriores. Esta versión de MSBuild suele ser innecesaria, pero permite que MSBuild tenga acceso a más memoria.

  • ¿Quieres ejecutar una compilación en varios procesos? Sin embargo, puede usar el IDE para lograr el mismo resultado en los proyectos de C++ y C#.

  • Quieres modificar el sistema de compilación. Por ejemplo, es posible que desee habilitar las siguientes acciones:

    • Preprocese los archivos antes de llegar al compilador.

    • Copie las salidas de compilación en un lugar diferente.

    • Cree archivos comprimidos a partir de salidas de compilación.

    • Realice un paso posterior al procesamiento. Por ejemplo, puede ser conveniente crear una marca de tiempo en un ensamblado con una versión diferente.

Puede escribir código en el IDE de Visual Studio, pero ejecutar compilaciones mediante MSBuild. Como alternativa, puede compilar código en el IDE en un equipo de desarrollo, pero ejecutar MSBuild desde la línea de comandos para compilar código integrado desde un repositorio de origen con colaboración de varios desarrolladores.

Nota

Puede usar Azure Pipelines para compilar, probar e implementar automáticamente la aplicación. El sistema de compilación puede ejecutar automáticamente compilaciones cuando los desarrolladores comprueban el código (por ejemplo, como parte de una estrategia de integración continua) o según una programación (por ejemplo, una compilación de prueba de comprobación de compilación nocturna). Azure Pipelines compila el código mediante MSBuild. Para más información, consulte Azure Pipelines.

Para ver un tutorial introductorio de MSBuild en Windows, consulte Tutorial: Uso de MSBuild.

Uso de MSBuild en una línea de comandos

Para ejecutar MSBuild en un símbolo del sistema, pase un archivo del proyecto a MSBuild.exe junto con las opciones de la línea de comandos adecuadas. Las opciones de línea de comandos permiten establecer propiedades, ejecutar destinos específicos y establecer otras opciones que controlan el proceso de compilación. Por ejemplo, usaría la siguiente sintaxis de línea de comandos para compilar el archivo MyProj.proj con la propiedad Configuration establecida en Debug.

Símbolo del sistema de Windows
MSBuild.exe MyProj.proj -property:Configuration=Debug

MSBuild no cambia su comportamiento en función de la extensión de archivo, pero la convención consiste en usar extensiones que terminan en proj como .csproj, .vcxprojo .vbproj, para el archivo de entrada principal de MSBuild, denominado "archivo de proyecto".

Para obtener más información sobre las opciones de línea de comandos de MSBuild, consulte la referencia de la línea de comandos.

Importante

Antes de descargar un proyecto, determine la confiabilidad del código.

Para .NET Core y .NET 5 o posterior, normalmente se usa dotnet build para invocar MSBuild. Consulte dotnet build. Si instala únicamente el SDK de .NET y no Visual Studio ni las herramientas de compilación de Visual Studio, entonces solo tiene MSBuild a través de dotnet build.

La línea de comandos dotnet build --help enumera las opciones de línea de comandos específicas de dotnet build, no todas las opciones de MSBuild.exe, pero todavía puede usar todas las opciones de línea de comandos enumeradas en la referencia de línea de comandos de MSBuild. Las opciones no procesadas por dotnet build se pasan a MSBuild.

Archivo de proyecto

MSBuild usa un formato de archivo de proyecto basado en XML que es sencillo y extensible. El formato de archivo de proyecto de MSBuild permite a los desarrolladores describir los elementos que se van a compilar y también cómo se van a compilar para diferentes sistemas operativos y configuraciones. Además, el formato de archivo del proyecto permite a los desarrolladores crear reglas de compilación reutilizables que se pueden factorizar en archivos independientes para que las compilaciones se puedan realizar de forma coherente en diferentes proyectos del producto.

El sistema de compilación de Visual Studio almacena lógica específica del proyecto en el propio archivo del proyecto y usa archivos XML de MSBuild importados con extensiones como .props y .targets para definir la lógica de compilación estándar. Los archivos .props definen propiedades de MSBuild y .targets archivos definen destinos de MSBuild. Estas importaciones a veces son visibles en el archivo de proyecto de Visual Studio, pero en proyectos más recientes como .NET Core, .NET 5 y .NET 6, no verá las importaciones en el archivo del proyecto; en su lugar, verá una referencia del SDK, que tiene el siguiente aspecto:

XML
<Project Sdk="Microsoft.Net.Sdk">

Estos se denominan proyectos de estilo SDK. Cuando se hace referencia a un SDK como el SDK de .NET, el SDK especifica implícitamente las importaciones de archivos de .props y .target.

En las secciones siguientes se describen algunos de los elementos básicos del formato de archivo de proyecto de MSBuild. Para obtener un tutorial sobre cómo crear un archivo de proyecto básico, consulte Tutorial: Creación de un archivo de proyecto de MSBuild desde cero.

Propiedades

Las propiedades representan pares clave-valor que se pueden usar para configurar compilaciones. Las propiedades se declaran mediante la creación de un elemento que tiene el nombre de la propiedad como elemento secundario de un elemento PropertyGroup. Por ejemplo, el código siguiente crea una propiedad denominada BuildDir que tiene un valor de Build.

XML
<PropertyGroup>
    <BuildDir>Build</BuildDir>
</PropertyGroup>

Puede definir una propiedad condicionalmente colocando un atributo Condition en el elemento . El contenido de los elementos condicionales se omite a menos que la condición se evalúe como true. En el ejemplo siguiente, la propiedad Configuration se define si aún no se ha definido.

XML
<Configuration  Condition=" '$(Configuration)' == '' ">DefaultValue</Configuration>

Se puede hacer referencia a las propiedades en todo el archivo del proyecto mediante la sintaxis $(<PropertyName>). Por ejemplo, puede hacer referencia a las propiedades de los ejemplos anteriores mediante $(BuildDir) y $(Configuration).

Para más información sobre las propiedades, consulte Propiedades de MSBuild.

Elementos

Los elementos son entradas en el sistema de compilación y normalmente representan archivos. Los elementos se agrupan en tipos de elementos en función de los nombres de elementos definidos por el usuario. Estos tipos de elementos se pueden usar como parámetros para las tareas, que usan los elementos individuales para realizar los pasos del proceso de compilación.

Los elementos se declaran en el archivo de proyecto creando un elemento que tiene el nombre del tipo de elemento como elemento secundario de un elemento ItemGroup. Por ejemplo, el código siguiente crea un tipo de elemento denominado Compile, que incluye dos archivos.

XML
<ItemGroup>
    <Compile Include = "file1.cs"/>
    <Compile Include = "file2.cs"/>
</ItemGroup>

Se puede hacer referencia a los tipos de elemento en todo el archivo del proyecto mediante la sintaxis @(<ItemType>). Por ejemplo, para hacer referencia al tipo de elemento del ejemplo, se usaría @(Compile).

En MSBuild, los nombres de elementos y atributos distinguen mayúsculas de minúsculas. Sin embargo, los nombres de propiedad, elemento y metadatos no están incluidos. El ejemplo siguiente crea el tipo de elemento Compile, comPile o cualquier otra variación de grafía, y asigna al tipo de elemento el valor "one.cs;two.cs".

XML
<ItemGroup>
  <Compile Include="one.cs" />
  <Compile Include="two.cs" />
</ItemGroup>

Los elementos se pueden declarar mediante caracteres comodín y pueden contener metadatos adicionales para escenarios de compilación más avanzados. Para obtener más información sobre los elementos, vea Elementos.

Tareas

Las tareas son unidades de código ejecutable que los proyectos de MSBuild usan para realizar operaciones de compilación. Por ejemplo, una tarea podría compilar archivos de entrada o ejecutar una herramienta externa. Las tareas se pueden reutilizar y pueden compartirlas diferentes desarrolladores en proyectos diferentes.

La lógica de ejecución de una tarea se escribe en código administrado y se asigna a MSBuild mediante el elemento UsingTask. Puede escribir su propia tarea mediante la creación de un tipo administrado que implemente la interfaz ITask. Para obtener más información sobre cómo escribir tareas, vea Tarea de escritura.

MSBuild incluye tareas comunes que puede modificar para adaptarse a sus requisitos. Algunos ejemplos son Copy, que copia archivos, MakeDir, que crea directorios y Csc, que compila archivos de código fuente de Visual C#. Para obtener una lista de las tareas disponibles junto con la información de uso, vea Referencia de tareas.

Una tarea se ejecuta en un archivo de proyecto de MSBuild creando un elemento que tiene el nombre de la tarea como elemento secundario de un elemento Target. Las tareas suelen aceptar parámetros, que se pasan como atributos del elemento. Tanto las propiedades como los elementos de MSBuild se pueden usar como parámetros. Por ejemplo, el código siguiente llama a la tarea MakeDir y le pasa el valor de la propiedad BuildDir que se declaró en el ejemplo anterior.

XML
<Target Name="MakeBuildDirectory">
    <MakeDir  Directories="$(BuildDir)" />
</Target>

Para obtener más información sobre las tareas, vea Tasks.

Objetivos

Los destinos agrupan las tareas en un orden determinado y exponen secciones del archivo de proyecto como puntos de entrada en el proceso de compilación. A menudo, los objetivos se agrupan en secciones lógicas para aumentar la legibilidad y permitir la expansión. Dividir los pasos de compilación en destinos le permite llamar a una parte del proceso de compilación desde otros destinos sin copiar esa sección de código en cada destino. Por ejemplo, si varios puntos de entrada en el proceso de compilación requieren que se compilen referencias, puede crear un destino que compile referencias y, a continuación, ejecutar ese destino desde cada punto de entrada donde sea necesario.

Los destinos se declaran en el archivo de proyecto utilizando el elemento Target. Por ejemplo, el código siguiente crea un destino denominado Compile, que luego llama a la tarea de Csc que tiene la lista de elementos declarada en el ejemplo anterior.

XML
<Target Name="Compile">
    <Csc Sources="@(Compile)" />
</Target>

En escenarios más avanzados, los destinos se pueden usar para describir las relaciones entre sí y realizar análisis de dependencias para que se puedan omitir secciones completas del proceso de compilación si ese destino es up-to-date. Para obtener más información sobre los destinos, consulte Destinos.

Registros de compilación

Puede registrar errores de compilación, advertencias y mensajes en la consola u otro dispositivo de salida. Para obtener más información, ver Obtención de registros de compilación con MSBuild.

Uso de MSBuild en Visual Studio

Visual Studio usa el formato de archivo de proyecto de MSBuild para almacenar información de compilación sobre proyectos administrados. La configuración del proyecto que se agrega o cambia mediante la interfaz de Visual Studio se refleja en el archivo de .*proj que se genera para cada proyecto. Visual Studio usa una instancia hospedada de MSBuild para compilar proyectos administrados. Esto significa que un proyecto administrado se puede compilar en Visual Studio o desde la línea de comandos (incluso si Visual Studio no está instalado), y los resultados serán idénticos.

Para obtener un tutorial sobre cómo usar MSBuild en Visual Studio, consulte Tutorial: Uso de MSBuild.

Multifocalización

Con Visual Studio, puede compilar una aplicación para que se ejecute en cualquiera de las versiones de .NET Framework o .NET Core, incluido .NET 5 y versiones posteriores. Por ejemplo, puede compilar una aplicación para que se ejecute en .NET Framework 4 en una plataforma de 32 bits y puede compilar la misma aplicación para que se ejecute en .NET Framework 4.8 en una plataforma de 64 bits. La capacidad de compilar para más de una versión de Framework se denomina multitargeting.

Estas son algunas de las ventajas de multiestinación:

  • Puede desarrollar aplicaciones destinadas a versiones anteriores de .NET Framework, por ejemplo, versiones 3.5 y 4.7.2.

  • Puede tener como destino un perfil de Framework, que es un subconjunto predefinido de un marco de trabajo de destino.

  • Si se publica un paquete de servicio para la versión actual de .NET Framework, podría seleccionarlo como objetivo.

  • Multitargeting garantiza que una aplicación use solo la funcionalidad que está disponible en el marco de destino y la plataforma.

Para obtener más información, vea Multitargeting.

Personalización de la construcción

MSBuild proporciona compatibilidad con una amplia gama de escenarios de compilación personalizados. La mayoría de las funcionalidades integradas se pueden invalidar o ampliar. Consulte Personalizar una compilación.

Acceso a MSBuild mediante programación

Si va a desarrollar una herramienta de compilación, es posible que quiera invocar MSBuild mediante programación desde una aplicación .NET. Mediante la API de MSBuild, puede controlar todos los aspectos de un sistema de compilación complejo. MSBuild proporciona un paquete NuGet con una API completa (el espacio de nombres Microsoft.Build) que puede usar desde una aplicación .NET para estos fines. Ver Uso de la API de MSBuild.

MSBuild es de código abierto

MSBuild es un proyecto de código abierto que acepta contribuciones de los usuarios en el repositorio de GitHub MSBuild.

Consulte también

Título Descripción
Tutorial: Creación de un archivo de proyecto de MSBuild desde cero Muestra cómo crear un archivo de proyecto básico de forma incremental mediante solo un editor de texto.
Guía paso a paso: Uso de MSBuild Presenta los bloques de creación de MSBuild y muestra cómo escribir, manipular y depurar proyectos de MSBuild sin cerrar el IDE de Visual Studio.
Conceptos de MSBuild Presenta los cuatro bloques de creación de MSBuild: propiedades, elementos, destinos y tareas.
Elementos Describe los conceptos generales que subyacen al formato de archivo de MSBuild y cómo encajan las partes.
Propiedades de MSBuild Presenta propiedades y colecciones de propiedades. Las propiedades son pares clave-valor que se pueden usar para configurar compilaciones.
Destinos Explica cómo agrupar tareas en un orden determinado y habilitar las secciones del proceso de compilación a las que se llamará en la línea de comandos.
Tareas Muestra cómo crear una unidad de código ejecutable que MSBuild puede usar para realizar operaciones de compilación atómicas.
Condiciones Describe cómo usar el atributo Condition en un elemento de MSBuild.
Procesamiento por lotes Describe cómo MSBuild clasifica las listas de elementos por metadatos para su ejecución en tareas y destinos.
Compatibilidad con múltiples versiones (multi-targeting) Muestra cómo establecer como destino varias versiones de .NET o varias plataformas.
Obtención de registros de compilación Describe cómo registrar eventos, mensajes y errores de compilación.
cómo MSBuild compila proyectos Describe el proceso de compilación interno que se usa en MSBuild.
Crear una tarea personalizada para la generación de código Muestra cómo crear una tarea personalizada, con un ejemplo de código.
Usar MSBuild para generar un cliente de API REST Muestra cómo ampliar la compilación para controlar la generación de cliente de la API REST, con un ejemplo de código.
recursos adicionales Enumera los recursos de comunidad y soporte técnico para obtener más información sobre MSBuild.

Referencia