El propósito del artículo es contar un poco sobre MSBuild, mostrar qué objetivos y tareas hay en MSBuild, aprender a trabajar con un archivo .csproj y proporcionar enlaces útiles. Si tiene un título más adecuado para el artículo, me complacerá analizarlo en los comentarios.
Menu
Conceptos básicos ( Menú )
MSBuild está diseñado de tal manera que el ensamblaje del proyecto se divide en varias etapas.
El objetivo es una determinada etapa (evento) que ocurre durante el ensamblaje de un proyecto. Puede usar objetivos estándar o definir los suyos propios.
La tarea es una tarea que se puede realizar en una determinada etapa. Puede usar tareas estándar o crear las suyas propias.
Cita de la documentación de orientación (
https://docs.microsoft.com/en-us/visualstudio/msbuild/msbuild-targets ):
Los objetivos agrupan las tareas en un orden particular y permiten que el proceso de construcción se factore en unidades más pequeñas.
Por ejemplo, un objetivo puede eliminar todos los archivos en el directorio de salida para prepararse para la compilación, mientras que otro
compila las entradas para el proyecto y las coloca en el directorio vacío.
MSBuild Build Lifecycle ( Menú )
Para MSBuild, Microsoft ha definido una serie de objetivos estándar (en los archivos Microsoft.Common.targets, Microsoft.CSharp.targets, etc.). Se define una gran cantidad de objetivos diferentes, pero en este artículo no nos detendremos en esto en detalle. Algunos objetivos estándar (ordenados):
Lista de objetivos (Spoiler)- Antes de reconstruir
- Limpio
- Antes de construir
- BuildOnlySettings
- PrepareForBuild
- PreBuildEvent
- ResolverReferences
- Preparar recursos
- ResolveKeySource
- Compilar
- Desinscripción no administrada
- GenerateSerializationAssemblies
- Crear conjuntos satelitales
- Generar Manifiestos
- GetTargetPath
- PrepareForRun
- Registro no administrado
- Limpieza incremental
- PostBuildEvent
- Afterbuild
- Afterrebuild
Los objetivos BeforeBuild y AfterBuild están específicamente diseñados para ser anulados y pueden usarse.
No recomiendo usar los objetivos restantes de la lista para que nada se rompa .
Para obtener una vista más detallada de la lista de objetivos, puede usar la opción
/ pp: Gracias a este parámetro, se generará un archivo en el que se incluirán todas las importaciones (incluidos los archivos .targets). Puede encontrar muchos objetivos y variables en él (gracias
aikixd por el consejo).
Preparación del entorno para ejemplos ( Menú )
Por ejemplo, necesitas:
- Entorno de desarrollo instalado de Visual Studio
- Cree un proyecto de tipo Aplicación de consola denominada MSBuildExample
- Abra la carpeta del proyecto y encuentre el archivo MSBuildExample.csproj allí
- Abra el archivo MSBuildExample.csproj en el bloc de notas u otro editor
En todos los ejemplos de este artículo, deberá editar el archivo MSBuildExample.csproj. Cada ejemplo implica eliminar el código del ejemplo anterior y agregar uno nuevo. El código debe agregarse al final del archivo .csproj a la última línea que contiene la etiqueta de cierre del proyecto.
Atencion En un archivo .csproj, el caso es importante .
Para ejecutar el ejemplo, debe ejecutar build en el entorno de desarrollo de Visual Studio. Para algunos ejemplos, deberá elegir una configuración de solución.

El resultado se mostrará en la ventana Salida en Visual Studio (abajo). Si no es así, ábralo a través de los elementos del menú Ver => Salida.

Orientación en MSBuild ( Menú )
Por ejemplo, utilizaremos la tarea
Mensaje , que mostrará información en la ventana Salida en Visual Studio. Como se mencionó anteriormente, hay objetivos estándar BeforeBuild y AfterBuild, los utilizaremos. Para capacitación, lea la sección
Preparación del entorno para ver ejemplos .
Ejemplo de uso de destino (spoiler)Código de ejemplo:
<Target Name="AfterBuild"> <Message Text="AfterBuild event" Importance="high"></Message> </Target> <Target Name="BeforeBuild"> <Message Text="BeforeBuild event" Importance="high"></Message> </Target>
Resultado de ejecución (excluido innecesariamente):
...
Evento antes de construir
...
Evento posterior a la construcción
...
Como puede ver, se ejecutó la tarea
Mensaje , que mostraba el texto que especificamos en el momento de BeforeBuild y AfterBuild en la ventana Salida en Visual Studio.
Al definir un objetivo con el mismo nombre, se sobrescribe.Ejemplo de reescritura de destino (spoiler)Código de ejemplo:
<Target Name="BeforeBuild"> <Message Text="First message" Importance="high"></Message> </Target> <Target Name="BeforeBuild"> <Message Text="Second message" Importance="high"></Message> </Target>
Resultado de ejecución (excluido innecesariamente):
...
Segundo mensaje
...
Solo se mostraba el segundo mensaje, porque usaban objetivos con el mismo nombre y el segundo valor lo sobrescribía.
Crear su propio objetivo de MSBuild ( Menú )
Si los objetivos BeforeBuild y AfterBuild no son suficientes o desea que las tareas se ejecuten en otra etapa del ciclo de vida del ensamblaje, puede definir su propio objetivo. Para estos fines, hay parámetros BeforeTargets y AfterTargets.
Ejemplo de definición de tus propios objetivos (spoiler)Código de ejemplo:
<Target Name="BeforeBuild"> <Message Text="BeforeBuild event" Importance="high"></Message> </Target> <Target Name="MyCustomBeforeTarget" BeforeTargets="BeforeBuild"> <Message Text="MyCustomBeforeTarget event" Importance="high"></Message> </Target> <Target Name="MyCustomAfterTarget" AfterTargets="BeforeBuild"> <Message Text="MyCustomAfterTarget event" Importance="high"></Message> </Target>
Resultado de ejecución (excluido innecesariamente):
...
Evento MyCustomBeforeTarget
Evento antes de construir
Evento MyCustomAfterTarget
...
Se definieron dos objetivos personalizados: MyCustomBeforeTarget y MyCustomAfterTarget.
El objetivo MyCustomBeforeTarget se ejecuta antes que el objetivo BeforeBuild porque especificamos:
BeforeTargets="BeforeBuild"
El objetivo MyCustomAfterTarget se ejecuta después del objetivo BeforeBuild porque especificamos:
AfterTargets="BeforeBuild"
Tareas en MSBuild ( Menú )
Este artículo no trata sobre cómo puede escribir sus propias tareas, pero antes de escribirlas
, consulte la lista de
tareas proporcionadas por Microsoft .
Veamos algunos ejemplos de uso de tareas y macros.
Parámetro de condición (spoiler)El parámetro
Condición está presente en todas las tareas. Cita de la documentación
docs.microsoft.com/en-us/visualstudio/msbuild/msbuild-task-reference :
Una expresión booleana que utiliza el motor MSBuild para determinar si esta tarea se ejecutará.
Código de ejemplo:
<Target Name="BeforeBuild"> <Message Text="Current configuration is Debug" Condition="'$(Configuration)' == 'Debug'" Importance="high"></Message> <Message Text="Current configuration is Release" Condition="'$(Configuration)' == 'Release'" Importance="high"></Message> </Target>
Si se selecciona la solución de configuración de depuración, el resultado se verá así (excluido innecesariamente):
...
La configuración actual es Depurar
...
Si se selecciona la Versión de configuración de la solución, el resultado se verá así (excluido innecesariamente):
...
La configuración actual es Release
...
Puede encontrar información sobre la macro $ (Configuración) y otras macros en la sección sobre
variables y macros en .csproj .
Puede encontrar información sobre la sintaxis de las condiciones en
https://docs.microsoft.com/en-us/visualstudio/msbuild/msbuild-conditions Definición variable en csproj (spoiler)En el ejemplo anterior, tenemos texto que se puede unificar. Para evitar la duplicación, colocaremos el texto del mensaje en una variable separada.
Código de ejemplo:
<PropertyGroup> <MessageText>Current configuration is $(Configuration)</MessageText> </PropertyGroup> <Target Name="BeforeBuild"> <Message Text="$(MessageText)" Condition="'$(Configuration)' == 'Debug'" Importance="high"></Message> <Message Text="$(MessageText)" Condition="'$(Configuration)' == 'Release'" Importance="high"></Message> </Target>
Para definir su propia variable, use el elemento
PropertyGroup .
Comprobando la existencia de un archivo, emitiendo un error (spoiler)En este ejemplo, realizamos una tarea que verifica si se ha creado el archivo App.Debug.config. Si no se crea, arrojamos un error. En caso de error, la compilación se detendrá y el error se mostrará como errores de compilación en la ventana Lista de errores.
Usamos la tarea
Error y el parámetro de condición que ya nos es familiar.
Código de ejemplo:
<Target Name="BeforeBuild"> <Error Condition="!Exists('App.Debug.config')" Text="File App.Debug.config not found"></Error> </Target>
Resultado:

La
cláusula Existe utiliza la ruta relativa desde la carpeta en la que se encuentra el archivo .csproj. Para acceder a la carpeta sobre la actual, use '../'. Si necesita acceder a la subcarpeta, use el formato '[DirectoryName] /App.Debug.config'.
Copiando archivos (spoiler)En este ejemplo, utilizaremos la tarea
Copiar . Usando la tarea, copie el archivo App.config a la carpeta bin / [Configuración] / Config en los dos archivos App.config y App.test.config.
Código de ejemplo:
<Target Name="BeforeBuild"> <Copy SourceFiles="App.config;App.config" DestinationFiles="$(OutputPath)/Test/App.config;$(OutputPath)/Test/App.test.config"></Copy> </Target>
La propiedad SourceFiles es una matriz de archivos para descargar. Indique sin comillas, separadas por punto y coma.
La propiedad DestinationFiles es una matriz de archivos donde se copiarán los archivos. Indique sin comillas, separadas por punto y coma.
Lea más sobre la macro $ (OutputPath) en la sección sobre
Variables y Macros en .csproj .
Variables y macros en .csproj ( Menú )
Se pueden usar varias macros estándar en el archivo .csproj, una lista de ellas se puede encontrar aquí
https://msdn.microsoft.com/en-us/library/c02as0cs.aspx y aquí
https://msdn.microsoft.com/en-us/ biblioteca / bb629394.aspx . Considere algunas macros útiles:
- $ (MSBuildToolsPath) : indica la ruta a la carpeta MSBuild. Por ejemplo, C: \ Archivos de programa (x86) \ MSBuild \ 14.0 \ Bin. Al combinar una ruta, use esta macro con una barra inclinada. Por ejemplo, $ (MSBuildToolsPath) \ Microsoft.Web.Publishing.Tasks.dll. De lo contrario, puede formar incorrectamente la ruta y dar un error de que no se encontró el archivo.
- $ (OutputPath) : ruta relativa a la carpeta de salida. Por ejemplo, bin \ Stage. Utilice esta macro con una barra diagonal, por ejemplo, $ (OutputPath) \ $ (TargetFileName) .config.
- $ (TargetFileName) : el nombre del archivo de salida con la extensión. Por ejemplo, MSBuildExample.exe. La extensión y el formato del nombre del archivo de salida pueden diferir de los diferentes tipos de proyectos. Con esta macro, puede determinar con seguridad cuál será el nombre del archivo de configuración. Puede ser útil para transformaciones de configuración.
- $ (Configuración) es el nombre de la configuración actual. Por ejemplo, Release, Debug
- $ (IntermediateOutputPath) : ruta a la carpeta obj. Por ejemplo, obj \ Stage.
Para definir sus propios parámetros, use el
PropertyGroup . Un ejemplo de cómo definir su propia variable se puede encontrar en la sección de
tareas en MSBuild .
Enlaces ( Menú )