¿Por qué un paso posterior a la compilación (xcopy) saldría ocasionalmente con el código 2 en una compilación de TeamCity?

93

Algunos proyectos en la solución de mi cliente tienen un evento posterior a la compilación: xcopyel resultado de la compilación en una carpeta específica. Esto funciona bien cuando se construye localmente. Sin embargo, en TeamCity, ocasionalmente obtengo

xcopy salió con el código 2

Si utilizo regular copy, sale con el código 1. Espero que esto tenga algo que ver con los bloqueos de archivos, aunque los archivos específicos que se copian no son los mismos, por lo que tal vez solo bloquee el directorio de destino compartido. Yo suelo /yno preguntar sobre la sobrescritura de archivos.

¿Por qué esto falla en TeamCity pero no localmente?

Tim Iles
fuente
Tuve problemas similares pero relacionados con la copia simultánea del mismo archivo en paralelo. ¿Podría comprobar que ningún archivo se copia dos veces?
Ignacio Soler García
4
El código de salida 2 significa The user pressed CTRL+C to terminate xcopy. Jeje.
Hans Passant
@SoMoS Sí, los archivos que se copian son definitivamente distintos.
Tim Iles
@HansPassant ¡No sé por qué teamcity querría presionar CTRL + C sobre mí! :(
Tim Iles
5
Yah, yo tampoco. La otra convención común es que el código de salida es igual al último error o excepción de Windows. El error 2 significa "archivo no encontrado". Lo que, por supuesto, tiene mucho más sentido.
Hans Passant

Respuestas:

147

Incluso si proporciona el /Yconmutador con xcopy, seguirá recibiendo un error cuando xcopy no sepa si lo que está copiando es un archivo o un directorio. Este error aparecerá como "salido con el código 2". Cuando ejecuta el mismo xcopy en un símbolo del sistema, verá que xcopy solicita una respuesta de archivo o directorio.

Para resolver este problema con una compilación automática, puede hacer eco en una respuesta predefinida con una tubería.

Para decir que lo que está copiando es un archivo, haga eco en F:

echo F|xcopy /y ...

Para decir que lo que está copiando es un directorio, haga eco en D:

echo D|xcopy /y ...

A veces, lo anterior se puede resolver simplemente usando un comando de copia en lugar de xcopy:

copy /y ...

Sin embargo, si no hay directorios que conduzcan al destino del archivo final, se producirá un "salida con el código 1".

Recuerde: use el /Cinterruptor y xcopy con precaución.

Pitufo Metro
fuente
Gracias @Metro Smurf. No puedo probar si esto habría resuelto mi problema, pero lo que dices suena inteligente, así que lo he marcado como la respuesta. ¡Salud!
Tim Iles
Me estaba encontrando exactamente con el mismo problema y finalmente terminé con una tubería en la respuesta. Con suerte, esto ayudará a alguien más a largo plazo.
Metro Smurf
1
"Esto no funciona en versiones localizadas de Windows, donde las palabras de aviso pueden ser diferentes. Un truco alternativo es agregar un asterisco " al final del destino, luego xcopy no solicitará Archivo / Directorio. - Govert Jan 28 a las 19:40 "Entonces, puede hacer la copia así sin echo D (que no es confiable): XCOPY $ (ProjectDir) .. \ scripts * $ (TargetDir) scripts * / Y / R. O haga la copia así sin echo F: XCOPY D: \ file.zip c: \ renamedFile.zip / Y / R
leetNightshade
@leetNightshade: ¿ *funcionará también con directorios? ¿O es esto solo para archivos?
Metro Smurf
@MetroSmurf Hm, parece que el formato de mi ejemplo falló, faltan barras diagonales inversas (debí pensar que estaba tratando de escapar de un símbolo) y falta un asterisco. Pero sí, funciona con directorios y archivos. Aquí está el enlace a la respuesta de Govert: stackoverflow.com/a/14022309/353094
leetNightshade
37

Arreglé el código de error 2 agregando un \ al final de mi ruta, sin él, xcopy pensará que es un archivo en lugar de una carpeta.

Benjiko99
fuente
3
Eso es. Funcionó bien en Windows 7, Visual Studio 2013. ¡Muchas gracias!
Charles
33

Si está utilizando xcopy en un evento posterior a la compilación, use el modificador / Y además de / C.

/C           Continues copying even if errors occur.
/Y           Suppresses prompting to confirm you want to overwrite an existing file.
DavidS
fuente
4
¡Tan sencillo! /Ysuprime el mensaje! ¿Por qué fue tan difícil de encontrar?
SouthShoreAK
3
/ Y suprime la solicitud de sobrescritura, pero esa no es la única razón para un código 2. RTFM no le dirá qué los causa.
MSalters
2

Mi solución para este problema fue ir a la carpeta bin de destino y asegurarme de que exista la subcarpeta adecuada allí. Una vez que esa subcarpeta se creó manualmente, el proceso de compilación se completó correctamente.

boomer57
fuente
2

copylo arregló para mí. xcopy with /c /yno funcionó. Estaba obteniendo una salida 4, así que seguí xcopy, pero resultó que necesitaba cotizaciones ($TargetPath).

Mi guión:

if $(ConfigurationName) == Debug copy "$(TargetPath)" "$(SolutionDir)\Folder\bin\Debug\$(TargetFileName)"
Mate
fuente
2

Probablemente estés usando TeamCity con git. Si es así, verifique que las carpetas que desea copiar existan en el repositorio de git. Por lo general, git aviod agrega carpetas de proyectos vacías al repositorio, por lo que xcopyno lo encuentra y genera un error.

Puede agregar un archivo de texto vacío a una carpeta vacía, confirmar y ver que la carpeta aparece en el repositorio.

iliya
fuente