2009-09-24 12 views
23

He seguido una publicación de blog de Scott Hanselman para managing configuration with PreBuild Events y la tengo funcionando bien.¿Varios eventos previos a la compilación en Visual Studio?

Ahora quiero dividir mi configuración en un par de archivos diferentes, por lo que es necesario volver a ejecutar el comando antes de la compilación. El problema es que el texto del evento PreBuild se ejecuta como un comando de consola. ¿Cómo puedo dividirlo como varios comandos?

Respuesta

39

Resulta que el problema es ejemplo de Scott no incluye el comando call al comienzo de la línea. Esto está bien siempre que no desee ejecutar el archivo .bat varias veces con diferentes parámetros.

Este:

call "$(ProjectDir)copyifnewer.bat" "$(ProjectDir)connectionStrings.config.$(ConfigurationName)" "$(ProjectDir)connectionStrings.config" 
call "$(ProjectDir)copyifnewer.bat" "$(ProjectDir)appSettings.config.$(ConfigurationName)" "$(ProjectDir)appSettings.config" 

funcionó bien para mí.

+1

En VS2008 no funcionó poner múltiples archivos CMD en líneas separadas. VS solo llamó al primer script en compilación. Agregué CALL en frente de cada línea y luego todo funcionó. –

+0

¿Por qué estas órdenes 'call' preguntas? Ver [aquí] (https://msdn.microsoft.com/en-us/library/ms165412.aspx). – Pascal

0

Debería poder poner los comandos en una línea separada, y luego cada comando se ejecutará en secuencia. Como alternativa, una forma "tramposo" a hacer lo mismo es el siguiente:

  • crear un segundo archivo por lotes que se ejecuta la parte deseada de la nueva funcionalidad, a continuación, crear un lote matriz que corre los dos archivos por lotes de componentes, y ejecuta ese nuevo lote en tu evento previo a la construcción. Por ejemplo: batch1.bat modifica el archivo 1, 2 batch2.bat archivo modifica, a continuación, se ejecuta tanto batch3.bat batch1.bat y batch2.bat
+1

Están en líneas separadas, pero parecen ejecutarse como una sola. He considerado el enfoque del archivo bat pero parece una solución alternativa en lugar de una solución. – Kirschstein

+0

Extraño. Ofrecería otras sugerencias (como agregar puntos y comas como separadores), pero estaría agarrando pajitas. ¡Lo siento! – MBillock

5

Estoy usando Visual Studio 2010 en Windows 7 64-bits.

He encontrado una solución que es mejor para mi gusto, yo soy el encadenamiento de comandos junto con && ^, por ejemplo, la edición de mi archivo xml .vcxproj así:

<PreBuildEvent> 
     <Command>echo "hello 1" &amp;&amp;^
echo "hello 2" &amp;&amp;^
echo "hello 3"</Command> 
     <Message>Performaing pre-build actions ...</Message> 
    </PreBuildEvent> 

he encadenado tres comandos juntos. El '& &' le dice al shell que deje de ejecutarse si el comando anterior se equivoca.

Nota, en el archivo .xml, uno no puede usar && directamente, entonces '& amp; & amp; ' se debe utilizar en su lugar. También tenga en cuenta el uso del carácter ^, este es el carácter de continuación de línea del intérprete cmd (como el carácter \ de BASH).

Cada nuevo comando debe comenzar al principio de la línea. Usando este enfoque, uno puede encadenar tantos comandos como uno desee, pero si alguno falla, el resto de la cadena no se ejecutará.

Aquí es mi caso de uso real, estoy realizar algunas comprobaciones del entorno con un script en Python, seguido de la copia de archivo de depuración de mi encabezado precompilado en el directorio de otro sub-proyecto:

<PreBuildEvent> 
     <Command>C:\Python27\python.exe "$(SolutionDir)check_path.py" 32 &amp;&amp;^
copy "$(SolutionDir)h1ksim_lib\vc$(PlatformToolsetVersion).pdb" "$(IntDir)" /-Y > nul</Command> 
     <Message>Performaing pre-build actions ...</Message> 
    </PreBuildEvent> 

El uso > nul en el comando de copia impide cualquier salida a aparecer en la ventana de construcción, por lo que mis compañeros de equipo no conseguirá asustado cuando dice 0 file(s) copied.

referencia a compartir encabezados precompilados entre los sub-proyectos está aquí:

Sharing precompiled headers between projects in Visual Studio

Cuestiones relacionadas