Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
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
En el Explorador de soluciones, seleccione el proyecto para el que quiere especificar el evento de compilación.
En el menú Proyecto, haga clic en Propiedades de {ProjectName} (o en el Explorador de soluciones, presione Alt+Entrar).
Seleccione Compilación > Eventos.
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.
En la sección Evento posterior a la compilación, especifique la sintaxis del evento de compilación.
Nota
Agregue una instrucción
callantes de todos los comandos posteriores a la compilación que ejecutan archivos .bat. Por ejemplo:call MyFile.batocall MyFile.bat call MyFile2.bat. Las rutas de acceso pueden ser absolutas o relativas a la carpeta de salida.En la sección Cuándo ejecutar el evento posterior a la compilación, especifique en qué condiciones ejecutar el evento posterior a la compilación.
Creación de los comandos del evento de compilación
Los comandos del evento de la compilación pueden incluir cualquier comando que sea válido en un indicador de comandos o en un archivo .bat. Los comandos disponibles se documentan en la Referencia de comandos de Windows. 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 introduciendo 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. Modificar los pasos en el archivo del proyecto está bien. Verá sus cambios en la sección Build > Events de las propiedades del proyecto una vez que guarde 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 Exec de MSBuild. Consulte la tarea Exec para obtener información sobre qué parámetros adicionales puede utilizar para personalizar la ejecución. Por ejemplo, puede 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)">
Puede usar las propiedades de MSBuild (macros), como OutDir en el ejemplo anterior, como se describe más adelante en este artículo en Macros.
Errores y otros resultados
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 de preconstrucció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 está limitada a una sola línea de salida, la primera línea que ingresó 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 objetivo en el archivo de 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 notifica ningún error si se escribe mal 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:
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)
echo DevEnvDir: $(DevEnvDir)
echo OutDir: $(OutDir)
echo ProjectDir: $(ProjectDir)
echo VisualStudioVersion: $(VisualStudioVersion)
echo AssemblySearchPaths: $(AssemblySearchPaths)
echo AssemblyName: $(AssemblyName)
echo BaseIntermediateOutputPath: $(BaseIntermediateOutputPath)
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
Escriba un comando copy para copiar la salida de compilación en otra carpeta.
xcopy "$(TargetDir)*.*" "C:\Drop\$(Configuration)\" /E /YEl comando hace referencia a las propiedades
TargetDirde MSBuild yConfiguration. Tenga en cuenta el uso de comillas, que son necesarias para controlar las rutas de acceso con espacios.Salga del Diseñador de propiedades y compile. Los archivos de salida deben copiarse en la carpeta
C:\Dropde destino , en laConfigurationsubcarpeta .En la ventana Salida , use la lista desplegable para cambiar para ver la salida de compilación y ver dónde se llamó al
xcopycomando. Si ve un error, confirme que la cuenta de usuario tiene acceso de escritura a la ubicación.
Ejemplo 2
Cree un archivo por lotes denominado
postbuild.baten la carpeta del proyecto con el siguiente contenido:echo Copying output file %1 to %1.copy copy %1 %1.copyRecuerde que en un archivo por lotes,
%1se refiere al primer argumento proporcionado.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)Si necesita usar el valor de una propiedad (macro) de MSBuild en un archivo por lotes, puede pasarlo como argumento como se muestra aquí.
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 ==========