Share via


Especificación de eventos de compilación (C#)

Use eventos de compilación para especificar comandos que se ejecutan antes de que se inicie la compilación o después de que esta finalice.

Especificación de un evento de compilación

  1. En el Explorador de soluciones, seleccione el proyecto para el que quiere especificar el evento de compilación.

  2. En el menú Proyecto , haga clic en Propiedades.

  3. Seleccione la pestaña Eventos de compilación.

  4. En el cuadro Línea de comandos del evento anterior a la compilación, especifique la sintaxis del evento de compilación.

    Nota

    Los eventos anteriores a la compilación no se ejecutan si el proyecto está actualizado y no se desencadena ninguna compilación.

  5. En el cuadro Línea de comandos del evento posterior a la compilación, especifique la sintaxis del evento de compilación.

    Nota

    Agregue una instrucción call antes de todos los comandos posteriores a la compilación que ejecutan archivos .bat. Por ejemplo: call MyFile.bat o call MyFile.bat call MyFile2.bat. Las rutas de acceso a la carpeta del proyecto pueden ser absolutas o relativas.

  6. En el cuadro Ejecutar el evento posterior a la compilación, especifique en qué condiciones se ejecuta el evento posterior a la compilación.

    Nota

    Para agregar una sintaxis más larga o para seleccionar cualquier macro de compilación desde el cuadro de diálogo Línea de comandos del evento anterior/posterior a la compilación, haga clic en el botón de puntos suspensivos (...) para mostrar un cuadro de edición.

  1. En el Explorador de soluciones, seleccione el proyecto para el que quiere especificar el evento de compilación.

  2. En el menú Proyecto, haga clic en Propiedades de {ProjectName} (o en el Explorador de soluciones, presione Alt+Entrar).

  3. Seleccione Compilación > Eventos.

    Captura de pantalla que muestra la configuración de eventos de compilación.

  4. En la sección Evento anterior a la compilación, especifique la sintaxis del evento de compilación.

    Nota

    Los eventos anteriores a la compilación no se ejecutan si el proyecto está actualizado y no se desencadena ninguna compilación.

  5. En la sección Evento posterior a la compilación, especifique la sintaxis del evento de compilación.

    Nota

    Agregue una instrucción call antes de todos los comandos posteriores a la compilación que ejecutan archivos .bat. Por ejemplo: call MyFile.bat o call MyFile.bat call MyFile2.bat. Las rutas de acceso a la carpeta del proyecto pueden ser absolutas o relativas.

  6. En el cuadro Cuándo ejecutar el evento posterior a la compilación, especifique en qué condiciones se ejecuta el evento posterior a la compilación.

Creación de los comandos del evento de compilación

Los comandos del evento de compilación puede incluir cualquier comando que sea válido en un símbolo del sistema o en un archivo .bat. El nombre de un archivo por lotes debe ir precedido por call para garantizar que todos los comandos posteriores se ejecuten. El propio archivo por lotes se ejecuta desde la carpeta de salida, por ejemplo, bin/Debug. Si necesita el mismo archivo por lotes para todas las configuraciones, puede colocarlo en la misma carpeta que el archivo del proyecto y usar una ruta de acceso relativa a él, por ejemplo, call ../../prebuild.bat.

Puede ejecutar scripts de PowerShell escribiendo un comando como PowerShell MyPowerShellScript.ps1. La ruta de acceso al script de PowerShell puede ser absoluta o puede ser relativa al directorio del proyecto. Habría que asegurarse de que la directiva de ejecución de los scripts de PowerShell en el sistema operativo está establecida correctamente para ejecutar el script. Vea Acerca de las directivas de ejecución.

Si quiere usar otro shell (como, por ejemplo, Bash), normalmente podría usar la misma sintaxis de comandos que para iniciar un script de shell desde el símbolo del sistema de Windows. El uso de shells de terceros está fuera del ámbito de esta documentación, pero sitios como el de Stack Overflow pueden resultar útiles.

En el archivo del proyecto

Al realizar los pasos anteriores, Visual Studio modifica el archivo del proyecto agregando el destino PreBuild o PostBuild y el código de MSBuild necesario para realizar los pasos proporcionados. Puede abrir el archivo del proyecto y ver los pasos. No pasa nada si modifica los pasos del archivo del proyecto. Verá los cambios en la sección Compilación > Eventos de las propiedades del proyecto después de guardar los cambios.

<Target Name="PreBuild" BeforeTargets="PreBuildEvent">
  <Exec Command="call prebuild.bat" />
</Target>

<Target Name="PostBuild" AfterTargets="PostBuildEvent">
  <Exec Command="call postbuild.bat" />
</Target>

El elemento Exec hace referencia a la tarea de MSBuild Exec. Consulta Tarea Exect para obtener información sobre qué otros parámetros puedes usar para personalizar la ejecución. Por ejemplo, puedes usar WorkingDirectory para establecer la carpeta desde la que se ejecuta el archivo ejecutable. El valor predeterminado es el directorio que contiene el archivo del proyecto.

<Exec Command="call prebuild.bat" WorkingDirectory="$(OutDir)">

Puedes usar las propiedades de MSBuild (macros), como OutDir en el ejemplo anterior, tal y como se describe más adelante en este artículo en Macros.

Errores y otra salida

La salida de los eventos de compilación se escribe en la sección Compilación de la Ventana de salida. Para abrirla, seleccione Ver>Otras ventanas, Ventana de salida o presione Ctrl+Alt+O. En la lista desplegable junto a Mostrar salida de, seleccione Compilación.

Si su evento anterior o posterior a la compilación no se completa correctamente, puede finalizar la compilación haciendo que la acción del evento salga con un código distinto de cero (0). Un código de salida cero indica que la acción se ha realizado correctamente; cualquier otro código de salida se considera un error.

Si se produce un error en el evento anterior a la compilación, es posible que vea un error similar al siguiente en la ventana Lista de errores:

MSB3073    The command "call c:\source\repos\prebuild.bat" exited with code 1.

Si no hay suficiente información en la ventana Lista de errores, pruebe a usar la Ventana de salida para ver la salida de compilación completa, incluida cualquier salida de archivos por lotes.

Sugerencia

La ventana Lista de errores se limita a una sola línea de salida, esto es, la primera línea que especificó para el evento. Si la salida de la ventana Lista de errores es importante para usted, no coloque más de una línea en el evento. Cree un archivo por lotes desde el símbolo del sistema de Windows o en el sistema operativo y, a continuación, simplemente use call mybatchfile.bat para el evento. Incluya los comandos en el propio archivo por lotes.

Para obtener instrucciones sobre los comandos que se pueden usar en los archivos por lotes, vea Comandos de Windows.

Macros

Las "macros" disponibles habitualmente (propiedades de MSBuild) se muestran en Propiedades comunes de MSBuild. En el caso de los proyectos del SDK de .NET (.NET Core o .NET 5 y versiones posteriores), se muestran propiedades adicionales en Propiedades de MSBuild para Microsoft.NET.Sdk.

En los scripts de eventos de compilación, puede que quiera hacer referencia a los valores de algunas variables de nivel de proyecto, como el nombre del proyecto o la ubicación de la carpeta de salida. En versiones anteriores de Visual Studio, se denominaban macros. El equivalente a las macros en las versiones recientes de Visual Studio son las propiedades de MSBuild. MSBuild es el motor de compilación que Visual Studio usa para procesar el archivo del proyecto cuando realiza una compilación. Un evento de compilación en el IDE da como resultado un destino de MSBuild en el archivo del proyecto. Puede usar cualquier propiedad de MSBuild que esté disponible en el destino en el archivo del proyecto (por ejemplo, $(OutDir) o $(Configuration)). Las propiedades de MSBuild que están disponibles en estos eventos dependen de los archivos importados implícita o explícitamente en un archivo del proyecto, como los archivos .props y .targets, y las propiedades establecidas en el archivo del proyecto, como en los elementos PropertyGroup. Tenga la precaución de usar la ortografía exacta de cada propiedad. No se notificará ningún error si se ha escrito incorrectamente una propiedad; en su lugar, una propiedad no definida se evalúa como una cadena vacía.

Por ejemplo, supongamos que especifica un evento anterior a la compilación de la siguiente manera:

Captura de pantalla que muestra un ejemplo de evento anterior a la compilación.

Ese evento anterior a la compilación da como resultado la siguiente entrada, denominada Target en el archivo del proyecto:

  <Target Name="PreBuild" BeforeTargets="PreBuildEvent">
    <Exec Command="echo Configuration: $(Configuration)&#xD;&#xA;echo DevEnvDir: $(DevEnvDir)&#xD;&#xA;echo OutDir: $(OutDir)&#xD;&#xA;echo ProjectDir: $(ProjectDir)&#xD;&#xA;echo VisualStudioVersion: $(VisualStudioVersion)&#xD;&#xA;echo AssemblySearchPaths: $(AssemblySearchPaths)&#xD;&#xA;echo AssemblyName: $(AssemblyName)&#xD;&#xA;echo BaseIntermediateOutputPath: $(BaseIntermediateOutputPath)&#xD;&#xA;echo CscToolPath: $(CscToolPath)" />
  </Target>

El evento de compilación aparece como un destino que incluye la tarea Exec con la entrada especificada como Command. Las nuevas líneas se codifican en XML.

Al compilar el proyecto en este ejemplo, el evento anterior a la compilación imprime los valores de algunas propiedades. En este ejemplo, $(CscToolPath) no genera ninguna salida, porque no está definida. Es una propiedad opcional que puede definir en el archivo de proyecto para proporcionar la ruta de acceso a una instancia personalizada del compilador de C# (por ejemplo, si estaba probando una versión diferente de csc.exeo un compilador experimental).

La salida de los eventos de compilación se escribe en la salida de compilación, que se puede encontrar en la ventana Salida. En la lista desplegable Mostrar resultados desde, elija Compilar.

Build started...
1>------ Build started: Project: ConsoleApp4, Configuration: Debug Any CPU ------
1>You are using a preview version of .NET. See: https://aka.ms/dotnet-core-preview
1>Configuration: Debug
1>DevEnvDir: C:\Program Files\Microsoft Visual Studio\2022\Preview\Common7\IDE\
1>OutDir: bin\Debug\net6.0\
1>ProjectDir: C:\source\repos\ConsoleApp4\ConsoleApp4\
1>VisualStudioVersion: 17.0
1>ALToolsPath:
1>AssemblySearchPaths: {CandidateAssemblyFiles};{HintPathFromItem};{TargetFrameworkDirectory};{RawFileName}
1>AssemblyName: ConsoleApp4
1>BaseIntermediateOutputPath: obj\
1>CscToolsPath:
1>Skipping analyzers to speed up the build. You can execute 'Build' or 'Rebuild' command to run analyzers.
1>ConsoleApp4 -> C:\source\repos\ConsoleApp4\ConsoleApp4\bin\Debug\net6.0\ConsoleApp4.dll

Nota:

Algunos escenarios requieren acciones de compilación más complejas de las que son capaces los eventos de compilación. Por ejemplo, para muchos escenarios comunes de generación de código, debe controlar las operaciones de limpieza y recompilación, y es posible que desee habilitar la compilación incremental para los pasos de generación de código, de modo que el paso solo se ejecute si la salida está desactualizada con respecto a las entradas. MSBuild está diseñado para controlar de forma inteligente todos estos escenarios. Considere la posibilidad de crear un destino personalizado que especifique la ejecución de AfterTargets o BeforeTargets durante un punto específico del proceso de compilación y, para un mayor control en escenarios avanzados, considere la posibilidad de crear una tarea personalizada o revise las distintas formas en que se puede personalizar la compilación.

Ejemplo

  1. Cree un archivo por lotes denominado postbuild.bat en la carpeta del proyecto con el siguiente contenido:

    echo Copying output file %1 to %1.copy
    copy %1 %1.copy
    

    Recuerde que, en un archivo por lotes, %1 hace referencia al primer argumento pasado.

  2. Llame al archivo por lotes en la sección Evento posterior a la compilación de las propiedades del proyecto y pase un argumento mediante la propiedad de MSBuild $(TargetPath).

    call postbuild.bat $(TargetPath)
    
  3. Compile el proyecto y compruebe la carpeta de salida. Debería ver el archivo copiado junto al ensamblado compilado. En la Ventana de salida, en la sección Compilación, debería ver la salida del archivo por lotes:

    1>Output file is C:\source\repos\ConsoleApp-BuildEvents\ConsoleApp-BuildEvents\bin\Debug\net6.0\ConsoleApp-BuildEvents.dll
    1>        1 file(s) copied.
    ========== Build: 1 succeeded, 0 failed, 0 up-to-date, 0 skipped ==========
    ========== Build started at 12:00 PM and took 00.723 seconds ==========