Visual Studio 2008 me permite declarar un comando y adjuntarlo al evento posterior a la compilación de un proyecto. Como muchos desarrolladores, lo uso regularmente para copiar archivos al directorio de salida de la aplicación.
Estoy trabajando en un proyecto en el que necesito copiar archivos de dos lugares diferentes a dos destinos diferentes, todo dentro de un solo proyecto. En otras palabras, necesito invocar dos comandos xcopy diferentes desde el mismo evento posterior a la compilación. Parece que el evento posterior a la compilación solo tomará un solo comando, y que si necesito invocar varios comandos, tendré que poner los comandos en un archivo * .bat y llamarlo desde el evento posterior a la compilación.
¿Es eso correcto o hay una forma más sencilla de invocar dos comandos desde el evento posterior a la compilación? Gracias de antemano por tu ayuda.
fuente
Importante: al ejecutar un archivo por lotes, debe utilizar la instrucción "call" para que se ejecuten las siguientes líneas. Si no usa "call", la ejecución pasa al .bat y no regresa a las siguientes líneas. Igual que en el indicador de DOS.
p.ej:
fuente
Hay otra opción: puedes separar los comandos con
&&
. P.ejcopy $(TargetPath) d:\folder1 && copy $(TargetPath) d:\folder2
Esto no es exactamente lo mismo que separar con nuevas líneas: con
&&
, si el comando anterior falló, el siguiente comando no se ejecutará.La separación por nuevas líneas es más fácil de leer, por lo que debería preferirla. Sin embargo, conozco al menos un caso cuando
&&
es útil. Es el escenario, cuando usa hojas de propiedades para tener diferentes pasos posteriores a la construcción en diferentes máquinas. VS 2008 no permite configurar PostBuildStep en las hojas de propiedades directamente, pero puede agregar una macro de usuario con su comando y llamarla desde la configuración principal del proyecto. Una macro es de una sola línea, por lo que puede utilizar&&
para tener varios comandos allí.fuente
Cada comando debe estar en una línea separada. Sin embargo, lo que encontré es que si hay un error al ejecutar uno de esos comandos, toda la compilación posterior falla, por lo que deberá probar cada comando posterior a la compilación uno a la vez para depurar.
fuente
Separando los comandos con & o && o; no funciona en VS2017. No puedo creer que una funcionalidad tan simple no esté disponible en VS2017. Visual Studio intenta ejecutar todo el texto en la ventana del evento posterior a la compilación como una cadena. La única opción para mí ahora es crear un script por lotes que no me gusta particularmente.
fuente
Agregando a la respuesta de womp :
Si tiene varias hojas de propiedades con algo que hacer en el mismo evento de compilación, puede hacer lo siguiente para encadenar los comandos:
donde se
%(Command)
expande al valor anterior del comando.Personalmente, hago esto para todos los eventos de compilación, incluso si actualmente no tengo comandos heredados, porque esto garantiza que no habrá problemas si agrego hojas de propiedades más adelante.
fuente
exit
instrucción por lotes en cualquier parte de la cadena hace que la cadena se interrumpa. De hecho,exit 1
hace que la compilación falle, mientras queexit 0
simplemente anula el paso y la compilación continúa.En Visual Studio 2017 puede hacer esto:
fuente
El enfoque sugerido por womp funciona en Visual Studio 2015/2017 (Windows), pero no funciona en Visual Studio para Mac (Vista previa), que parece ejecutar solo el primero de los comandos. El único enfoque que encontré funcionando en las versiones de Visual Studio para Mac y Windows fue encadenar 2 comandos de MSBuild:
El ejemplo anterior usa el evento "AfterResolveReferences" pero obviamente también debería funcionar para el evento PostBuild.
fuente
No existe una buena solución para este problema. La idea de llamada hace que se ejecuten otros scripts. He notado que la detección de errores no funcionará. Ponga 'exit / b 1' en FailMe.cmd El uso 'call FailMe.cmd' en los pasos posteriores a la compilación. ¿Notas que la construcción no falla? Estoy usando VS 2017 construyendo un proyecto C #. Ahora inténtelo con 'FailMe.cmd' La compilación ahora informa de un error.
Por lo tanto, es mejor que use un solo script, si el informe de errores es importante.
fuente
Simplemente prefija "llamada" a su secuencia de comandos por lotes. De modo que las declaraciones debajo del script por lotes también se ejecutan después de devolver la llamada desde el script por lotes.
fuente