Post Build salió con el código 1

108

Tengo un proyecto con un evento posterior a la construcción:

copy $(ProjectDir)DbVerse\Lunaverse.DbVerse.*.exe  $(TargetDir)

Funciona bien siempre en mi máquina. Tengo un nuevo desarrollador que siempre recibe el error "salió con el código 1". Le pedí que ejecutara el mismo comando en un indicador de DOS y funcionó bien. ¿Qué podría estar causando esto? ¿Hay alguna forma de llegar al error real?

Ambos estamos usando Visual Studio 2008.

Tim Scott
fuente
en mi caso, la respuesta que proporciona Tim Scott cerca del final de esta página (así que la paso por alto al principio) resuelve mi problema.
Yu yang Jian

Respuestas:

115

Tenía un espacio en uno de los nombres de carpeta en su ruta, y no tenía comillas.

Tim Scott
fuente
12
poner comillas en los nombres de las rutas es una buena práctica. no trabajar en rutas que contienen espacio es mejor :-)
Asher
4
copy / y "$ (TargetDir) Dotfuscated \" "$ (TargetDir)" este comando no funciona para mí y si escribo exit 0 al final, entonces funciona bien. ¿puedes decirme por qué?
Rikin Patel
59

El de los "Pings" me ayudó ... pero se puede explicar un poco mejor ...

Para mí la solución fue cambiar:

copy $(TargetDir)$(TargetName).* $(SolutionDir)bin

a esto:

copy "$(TargetDir)$(TargetName).*" "$(SolutionDir)bin"

Espero que funcione para ti. :-)

JanBorup
fuente
48

He añadido esto para futuros visitantes ya que es una pregunta bastante activa.

ROBOCOPY sale con "códigos de éxito" inferiores a 8. Consulte: http://support.microsoft.com/kb/954404

Esto significa que:

robocopy exit code 0 = no files copied
robocopy exit code 1 = files copied
When the result is 1, this becomes an error exit code in visual studio.

Así que resolví esto fácilmente agregando esto al final del archivo por lotes

exit 0

Sugerir que maneje los errores de ROBOCOPIA de esta manera

rem each robocopy statement and then underneath have the error check.
if %ERRORLEVEL% GEQ 8 goto failed

rem end of batch file
GOTO success

:failed
rem do not pause as it will pause msbuild.
exit 1

:success
exit 0    

La confusión se establecerá cuando no se copien archivos = no hay error en VS. Luego, cuando hay cambios, los archivos se copian, VS errores, pero se hizo todo lo que el desarrollador quería.

Consejo adicional: no utilice una pausa en el script, ya que se convertiría en una pausa indefinida en la compilación de VS. mientras desarrolla el guión, use algo como timeout 10. Notarás esto y lo comentarás en lugar de tener una compilación colgante.

Valamas
fuente
4
Justo lo que estaba buscando. ¡¡Gracias!!
Ricky
Golpear una respuesta de 8 años para decir que, si desea un archivo de una sola línea, y no un archivo bat, puede agregar un "& exit 0" al final de la cadena del evento posterior a la compilación.
Eric Wu
46

Mi razón para el Código 1 fue que la carpeta de destino era de solo lectura. ¡Espero que esto ayude a alguien! Tuve un evento de compilación posterior para hacer una copia de un directorio a otro y el destino era de solo lectura. ¡Así que simplemente desmarqué el atributo de solo lectura en el directorio y todos sus subdirectorios! ¡Solo asegúrese de que sea un directorio seguro para hacerlo!

Shalini
fuente
Me salvó una hora, ¡gracias! La descarga de código de Internet y Windows 7 configura la carpeta como de solo lectura automáticamente.
Johan Petersson
1
También usé xcopy en su lugar y con el indicador / y. Todos los comandos microsoft.com/resources/documentation/windows/xp/all/proddocs/…
Johan Petersson
8

Tuve que ejecutar VS como administrador para que mi copia posterior a la compilación en un sistema operativo protegido ".. \ Common7 \ IDE \ PrivateAssemblies" funcionara

wruckie
fuente
5

Para aquellos, que utilizan ' copia ' comando en Eventos de generación ( línea de comandos del evento Pre-construcción o / y la línea de comandos del evento posterior a la generación ) de Proyecto -> Propiedades : le ' copiar ' parámetros de comando debe ser similar aquí: copy "source of files" "destination for files". Recuerde utilizar comillas (para evitar problemas con los espacios en las cadenas de direcciones).

Bohdan Kuts
fuente
4

Tuve un problema similar pero específicamente en un entorno de compilación de Jenkins. Para solucionar el problema, cambié de usar un comando de copia en el evento posterior a la compilación a usar un destino de copia.

Cambié esto:

   <PropertyGroup>
      <PostBuildEvent>copy $(ProjectDir)bin\BLAH.Common.xml $(ProjectDir)App_Data\BLAH.Common.xml</PostBuildEvent>
   </PropertyGroup>

a esto:

  <Target Name="AfterBuild">
    <Copy SourceFiles="$(ProjectDir)bin\BLAH.Common.xml" DestinationFolder="$(ProjectDir)App_Data\" />
  </Target>

y funciona bien ahora.

El error específico que recibía era:

(PostBuildEvent target) -> 
  C:\Windows\Microsoft.NET\Framework\v4.0.30319\Microsoft.Common.targets(4291,5): error MSB3073: The command "copy <http://1.2.3.4/job/BLAHv2/ws/Api/bin/BLAH.Common.xml> <http://1.2.3.4/job/BLAHv2/ws/Api/App_Data/BLAH.Common.xml"> exited with code 1. [<http://1.2.3.4/job/BLAHv2/ws/Api/Api.csproj]>
TechSavvySam
fuente
¿Cómo hiciste ese cambio? ¿Lo editaste manualmente? ¿Cómo ejecutas el objetivo? Parece algo que tendrías que especificar en la línea de comandos de msbuild. Tengo exactamente el mismo problema en mi entorno jenkins, lo cual es extraño porque todas las carpetas creadas por msbuild son siempre de solo lectura. Por qué se copia bien en mi máquina pero no en el servidor, es algo que se me escapa.
shawn1874
Acabo de usar Notepad ++ para editar el archivo csproj. El gancho "AfterBuild" es un gancho estándar, por lo que si existe, se llama automáticamente después del proceso de construcción.
TechSavvySam
Gracias. No estaba seguro de si tenía un archivo msbuild personalizado con un objetivo o si era solo el archivo creado por Visual Studio. FYI: En mi caso, descubrí que el problema tenía que ver con el orden de construcción. Olvidé establecer las dependencias de compilación en la versión, la configuración de la solución para que los proyectos se construyeran en el servidor en un orden diferente, de modo que el archivo de entrada aún no estaba disponible cuando se ejecutó la copia. Asegurándome de que el .dll se produjo antes que el otro proyecto que lo necesitaba me lo arregló. Ese fue un problema muy sutil con la configuración de la solución que lo causó.
shawn1874
Al principio, no era obvio que el orden de construcción es para cada configuración. Pensé que era más una configuración de solución, pero evidentemente tienes que actualizar el orden de compilación en TODAS las configuraciones.
shawn1874
3

Pude arreglar mi Código 1 ejecutando Visual Studio como administrador. Aparentemente, no tenía acceso para ejecutar los comandos de shell sin Admin.

jdurden
fuente
2

Para mí, tenía que asegurarme de que el programa al que estaba copiando el archivo no se estuviera ejecutando en ese momento. No hubo errores en la sintaxis. Espero que esto ayude a alguien.

Richard S.
fuente
2

Acabo de recibir el mismo error. Tenía un% en la ruta de destino que necesitaba escapar

c:\projects\%NotAnEnvironmentVariable%

necesitaba ser

c:\projects\%%NotAnEnvironmentVariable%%
mosca de fuego
fuente
2

Ok, este es un problema con muchas soluciones, así que publico el mío para dar más pistas a la gente. Mi situación es verificar las carpetas en su ruta y asegurarme de que todas existan en su máquina. Por ejemplo: "$ (SolutionDir) \ partBin \ Bin \ $ (ProjectName) .pdb", pero "Bin" no está en la carpeta partBin.

David
fuente
1
Por cierto, \ after $(SolutionDir)es redundante.
Diablo
2

Para aquellos que usan el comando 'copiar' en Eventos de compilación (línea de comando de evento previo a la compilación o / y línea de comando de evento posterior a la compilación) desde Proyecto -> Propiedades: la carpeta de destino debe existir

sincronizado
fuente
0

Tantas soluciones ...

En mi caso, tuve que guardar el archivo bat con codificación no Unicode (Western, Windows). De forma predeterminada, cuando agregué el archivo a Visual Studio (y probablemente debería haberlo hecho fuera del VS), se agregó con codificación UTF-8.

Tengiz
fuente
0

Tuve el mismo problema y resultó que era porque había cambiado el nombre del proyecto. Entré en las propiedades del proyecto y cambié el nombre del ensamblado y el espacio de nombres raíz al nombre del proyecto y funcionó muy bien después de eso.

golgothan3
fuente
0

Otra respuesta más ...

En mi caso, tuve un proyecto de Visual Studio 2017 dirigido tanto a .Net Standard 1.3 como a .Net Framework 2.0. Esto se especificó en el archivo .csproj así:

<TargetFrameworks>netstandard1.3;net20</TargetFrameworks>

También tuve una línea de comando de evento posterior a la compilación como esta:

copy "E:\Yacks\YacksCore\YacksCore\bin\net20\Merlinia.YacksCore.dll" "E:\Merlinia\Trunk-Debug\Shared Bin\"

En otras palabras, estaba tratando de copiar el .Net Framework .dll producido por la compilación en una ubicación alternativa.

Esto estaba fallando con este error cuando hice una reconstrucción:

MSB3073 The command "copy "E:\Yacks\YacksCore\YacksCore\bin\net20\Merlinia.YacksCore.dll" "E:\Merlinia\Trunk-Debug\Shared Bin\"" exited with code 1.

Después de mucha frustración, finalmente determiné que lo que estaba sucediendo era que Rebuild eliminó todos los archivos de salida, luego hice la compilación para .Net Standard 1.3, luego traté de ejecutar la línea de comando del evento posterior a la compilación, que falló porque el archivo que se iba a copiar aún no estaba construido.

Entonces, la solución fue cambiar el orden de construcción, es decir, compilar primero para .Net Framework 2.0 y luego para .Net Standard 1.3.

<TargetFrameworks>net20;netstandard1.3</TargetFrameworks>

Esto ahora funciona, con el problema menor de que la línea de comando del evento posterior a la compilación se ejecuta dos veces, por lo que el archivo se copia dos veces.

RenniePet
fuente
0

En mi caso, tuve que cd(cambiar de directorio) antes de llamar al archivo bat, porque dentro del archivo bat había una operación de copia que especificaba rutas relativas.

:: Copy file
cd "$(ProjectDir)files\build_scripts\"
call "copy.bat"
CrazyTim
fuente