programa politico para maestros maestro guion eventos evento escolares ejemplos ejemplo dirigir danzas curso conducir como ceremonias ceremonia aniversario c# visual-studio visual-studio-2008 scripting build

c# - politico - maestro de ceremonias escolares



Hacer guiones de eventos pre y post compilaciĆ³n bastante? (2)

Si coloca sus scripts en un archivo por lotes, VS guarda bastante silencio al respecto. Sin embargo, cuando necesite acceder a $ (projectName), tendrá que pasarlos como parámetros al archivo por lotes. Busqué configuraciones que pudieran afectar la salida pero no pude encontrar ninguna.

Probado con este archivo por lotes (d: / test.bat); el @echo apagado ni siquiera es necesario:

@echo off echo "I''m Gonna Fail" exit 1

Establezca el Pre-Build Event->Command Line en d: / test.bat , deje Description vacía (la descripción es lo que se muestra en lugar de Realizar el evento de preconstrucción .... En VS2008, obtengo esto en la ventana de producción de compilación para un Proyecto C ++:

Performing Pre-Build Event... "I''m Gonna Fail" Project : error PRJ0002 : Error result 1 returned from ''C:/Windows/system32/cmd.exe''.

Para un proyecto de C #, esto se muestra en su lugar (con el nivel de MSBuild verbosity configurado en normal ):

Target PreBuildEvent: d:/test.bat "I''m gonna fail" Microsoft.Common.targets(895,9) error MSB3073: The command "d:/test.bat" exited with code 1.

Tengo algunas secuencias de comandos de eventos moderados antes y después de la compilación para mis proyectos de Visual Studio 2008 (en realidad se trata principalmente de scripts de eventos posteriores a la construcción). Funcionan bien porque funcionan correctamente y cuando salgo de exit 0 la construcción tiene éxito y cuando salgo de exit 1 la compilación falla con un error. Sin embargo, ese error es enorme y es algo como esto:

The command "if Release == Debug goto Foo if Release == Release goto Bar exit 0 :Foo mkdir "abc" copy "$(TargetDir)file.dll" "abc" [...] " exited with code 1.

Entiendes la idea. Toda la secuencia de comandos siempre se descarta como parte de la descripción del error. La secuencia de comandos completa también se descarta en la ventana de Salida mientras se desarrolla la construcción. Entonces, ¿por qué he visto varias referencias en la web para usar echo en estos scripts? Por ejemplo, aquí hay parte de un ejemplo en un sitio en particular:

:BuildEventFailed echo POSTBUILDSTEP for $(ProjectName) FAILED exit 1 :BuildEventOK echo POSTBUILDSTEP for $(ProjectName) COMPLETED OK

¿Hay alguna manera de que Visual Studio suprima todos los resultados del script además de lo que se echo (y por lo tanto, usar echo solo para producir lo que quieres tendría sentido) o estos ejemplos están equivocados y no se dan cuenta de que el conjunto la secuencia de comandos siempre se descarta?


OK - el núcleo del problema parece ser que los motores de compilación Visual Studio C ++ y C # son bastante diferentes.

El motor de compilación de C ++ ejecuta el código de lote especificado en el evento anterior o posterior al proyecto ''Línea de comando'' del proyecto sin descargar el código real en la ventana de Salida; simplemente descarta lo que el código emite, así como lo que se envía por los comandos que ejecuta el código (como los ''2 archivos copiados'' del comando de copia, etc.) Los ejemplos que he visto alrededor del web son supuestamente para el motor de compilación C ++ de Visual Studio, porque no hay necesidad de repetir nada con el motor de compilación C # si estás poniendo tu código de lote C o antes de la compilación en el cuadro de ''línea de comando de evento'' del proyecto C # .

Esto se debe a que el motor de compilación C #, que estaba usando, va a volcar todo el código en ese cuadro a la ventana de Salida. Es más, si el código falla, incluye todo el bloque de código en esa casilla en el mensaje de error que aparecerá en ''Lista de errores'' - el motor de compilación C ++ no lo hace (más sobre esto más adelante).

La mejor solución que he encontrado, por lo tanto, es minimizar la cantidad de código que coloca en el cuadro de línea de comandos de un evento C o antes o después de la compilación. Todo lo que coloque allí se arrojará a la ventana de Salida a medida que se ejecuta. La mejor manera de minimizar el código es hacer que simplemente ejecute un archivo por lotes y pasar los argumentos necesarios al archivo por lotes. El contenido del archivo por lotes NO se arrojará a la ventana Salida, pero (al igual que con el código en la ''Línea de comando'' para el motor de compilación C ++) echo salida y salida de echo de los comandos que ejecuta el código del archivo por lotes; esta es una buena forma de controlar el resultado de un script C * pre o post-build. El motor de compilación C ++, entonces, trata el código especificado en el cuadro ''Línea de comando'' de la misma manera que el motor C # trata el código en un archivo por lotes; no descarga el código en sí, solo el resultado del código.

Así que, básicamente, si está compilando un proyecto de C ++ en Visual Studio, puede simplemente colocar todo el script por lotes en el cuadro "Línea de comando" y no se descargará en la ventana de resultados. Sin embargo, si compila un proyecto de C #, le recomiendo que coloque su secuencia de comandos por lotes en un archivo .bat separado, y que solo llame a ese archivo con los argumentos apropiados del cuadro de línea de comandos de evento anterior o posterior a la construcción. Terminé con mi cuadro de línea de comandos de eventos posteriores a la construcción de C # con el siguiente aspecto:

../../BuildScripts/PostBuild.bat $(ConfigurationName) $(ProjectName) "$(TargetDir)" "$(ProjectDir)"

... y mi archivo PostBuild.bat con el siguiente aspecto:

@REM Store args... set _configName=%1% set _projectName=%2% @REM Remove quotes from remaining args... set _targetDir=###%3%### set _targetDir=%_targetDir:"###=% set _targetDir=%_targetDir:###"=% set _targetDir=%_targetDir:###=% set _projectDir=###%4%### set _projectDir=%_projectDir:"###=% set _projectDir=%_projectDir:###"=% set _projectDir=%_projectDir:###=% if %_configName% == Release goto StartProcessing echo No post-build processing required. exit 0 @REM Start post-build processing :StartProcessing echo Starting post-build processing. @REM use input args to do batch script work, such as: copy "%_targetDir%*.dll" "%_projectDir%../../../../../CommonAssemblies" if errorlevel 1 goto CopyFailure @REM etc. goto PostBuildSuccess @REM Failure labels :CopyFailure echo Post-build processing for %_projectName% FAILED: Failed to copy file(s) to common assemblies directory! exit 1 @REM Post-build success :PostBuildSuccess echo Post-build processing for %_projectName% completed OK. exit 0

Esto controla la salida de forma mucho más nítida, y solo las cosas echo en este script por lotes se enviarán a la ventana de Salida.

Finalmente, como se mencionó anteriormente, los motores de compilación C # y C ++ también generan diferentes cosas en el mensaje de error que aparece en ''Lista de errores'', cuando falla el proceso posterior a la compilación (es decir, el código del lote sale con un código distinto de 0 ). El motor de compilación C ++ siempre parece decir:

Error result 1 returned from ''C:/Windows/system32/cmd.exe''.

Sin embargo, el motor de compilación de C # incluirá todo el contenido de la casilla de línea de comando del evento anterior o posterior a la compilación (lo que falle) en el mensaje de error, por ejemplo:

The command "../../BuildScripts/PostBuild.bat Release MyProject "C:/Development/MyProject/bin/" "C:/Development/MyProject/"" exited with code 1.

Todavía un poco bobo por un solo mensaje de error, pero mucho más manejable que tener todo el código que movimos en el archivo por lotes incluido en el mensaje de error.

Aun así, sería bueno poder personalizar este mensaje de error que aparece en la Lista de Errores para mostrar algo que defino. Dudo que sea posible, pero si alguien sabe cómo hacerlo, ¡no dude en publicarlo como comentario!