visual-studio-2010 - vscode - visual studio code yeoman
Uso de robocopy con Visual Studio 2010 Post-build y eventos Pre-build (6)
Agregando esta respuesta por solicitud. Basado en la solución de Asaf, y agregando el comentario de skrebbel.
Puede simplificar el cheque para:
robocopy <opt> <src> <tgt>
if %errorlevel% leq 1 exit 0 else exit %errorlevel%
Como se comentó amablemente en los comentarios, es posible que desee ajustar el ''1'': depende de lo que su operación debería tratar como un error. Eche un vistazo al significado de los bits que en combinación componen el número devuelto por robocopy :
0 × 10 Error grave. Robocopy no copió ningún archivo. Esto es un error de uso o un error debido a privilegios de acceso insuficientes en los directorios de origen o destino.
0 × 08 Algunos archivos o directorios no se pudieron copiar (se produjeron errores de copia y se rebasó el límite de reintentos). Verifique estos errores aún más.
0 × 04 Se detectaron algunos archivos o directorios no coincidentes. Examine el registro de salida. La limpieza es probablemente necesaria.
0 × 02 Se detectaron algunos archivos o directorios extra. Examine el registro de salida. Algo de limpieza puede ser necesario.
0 × 01 Uno o más archivos se copiaron correctamente (es decir, han llegado nuevos archivos).
0 × 00 No se produjeron errores y no se realizó ninguna copia. Los árboles de directorios de origen y destino están completamente sincronizados.
Robocopy produce 1 cuando tiene éxito, a diferencia de la mayoría de los programas que salen con 0 en caso de éxito. Visual Studio (y MSBUILD) interpreta el código de salida de 1 como un error.
¿Cómo se puede usar Robocopy en los eventos posteriores a la construcción de Visual Studio de modo que el entorno de construcción identifique correctamente su falla y éxito?
Nota: esto es más o menos un reenvío de esta publicación .
Con <src>, <tgt> siendo la fuente y el destino de la copia con respeto, y <opt> siendo opciones de robocopy:
robocopy <opt> <src> <tgt>
set rce=%errorlevel%
if not %rce%==1 exit %rce% else exit 0
Por ejemplo, si queremos copiar el objetivo del proyecto a c: / temp, sin reintentos y con todos los subdirectorios (vacíos o no), usaríamos:
robocopy /R:0 /E $(TargetDir) c:/temp
set rce=%errorlevel%
if not %rce%==1 exit %rce% else exit 0
Descubrí que es mucho más fácil iniciar robocopy en lugar de intentar llamarlo en línea con Visual Studio. De esta forma, Visual Studio no se preocupa por el código de retorno de robocopy.
start robocopy . ../latestbuild
La única diferencia que pude ver es que verá un símbolo del sistema aparecer y desaparecer para ejecutar el comando robocopy.
Usar call en lugar de start en realidad no abre el símbolo del sistema y, aún mejor, redirige la salida de robocopy a la ventana de salida de Visual Studio.
call robocopy . ../latestbuild
Por alguna razón, este enfoque solo funciona cuando se utiliza en la línea de comandos de eventos de precompilación.
Simplemente verificar si el código de salida es 1 es incorrecto, ya que cualquier código de salida debajo de 8 no es erróneo :
Cualquier valor superior a 8 indica que hubo al menos una falla durante la operación de copia.
(Solo para aclarar, un código de salida de 8 también es un error: Several files did not copy
)
El código apropiado, entonces, debería verse así:
IF %ERRORLEVEL% GEQ 8 exit 1
exit 0
Sintácticamente aquí hay una versión de una línea por comando que funciona directamente dentro de los pasos de PreBuild:
(robocopy "$(ProjectDir)../Dir1" "$(ProjectDir)Dir1" "Match.*" /a+:R) ^& IF %ERRORLEVEL% GEQ 8 exit 1
(robocopy "$(ProjectDir)../Dir2" "$(ProjectDir)Dir2" "Match.*" /a+:R) ^& IF %ERRORLEVEL% GEQ 8 exit 1
exit 0
Referencias
- @OhadSchneider respuesta para GEQ 8
- Esta respuesta sobre por qué la salida 0 debe estar al final.
El paquete de extensión MSBuild contiene una tarea Robocopy que puede usar en su proceso de compilación.
¿Puede ser esta una solución para usted en lugar de VS pre / postbuilds?
De ser así, puede extender el proceso de compilación de Visual Studio anulando los objetivos Before Build, After Build y llamando a la tarea de Robocopy (también puede anular otros objetivos si se ajustan mejor a sus necesidades; consulte la lista en la página de MSDN vinculada)
Por lo tanto, en realidad debe descargar e instalar el paquete de extensión MSBuild antes que abrir el archivo csproj / vbproj de su proyecto y editarlo de la siguiente manera:
Agregar las siguientes entradas para importar la tarea Robocopy de MSBuild Extensionpack
<PropertyGroup>
<TPath>$(MSBuildExtensionsPath32)/ExtensionPack/4.0/MSBuild.ExtensionPack.tasks</TPath>
</PropertyGroup>
<Import Project="$(TPath)"/>
Reemplazando BeforeBuild, AfterBuild y ejecutando la tarea de Robocopy
<Target Name="BeforeBuild">
<Message Text="Beforebuild" />
<MSBuild.ExtensionPack.FileSystem.RoboCopy Source="C:/temp/robo_src1" Destination="C:/temp/robo_dest1" Files="*.*" Options="/MIR">
<Output TaskParameter="ExitCode" PropertyName="Exit" />
<Output TaskParameter="ReturnCode" PropertyName="Return" />
</MSBuild.ExtensionPack.FileSystem.RoboCopy>
<Message Text="ExitCode = $(Exit)"/>
<Message Text="ReturnCode = $(Return)"/>
</Target>
<Target Name="AfterBuild">
<MSBuild.ExtensionPack.FileSystem.RoboCopy Source="C:/temp/robo_src2" Destination="C:/temp/robo_dest2" Files="*.*" Options="/MIR">
<Output TaskParameter="ExitCode" PropertyName="Exit" />
<Output TaskParameter="ReturnCode" PropertyName="Return" />
</MSBuild.ExtensionPack.FileSystem.RoboCopy>
<Message Text="ExitCode = $(Exit)"/>
<Message Text="ReturnCode = $(Return)"/>
</Target>