Post Build terminato con il codice 1


108

Ho un progetto con un evento post build:

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

Funziona bene ogni volta sulla mia macchina. Ho un nuovo sviluppatore che riceve sempre l'errore "uscito con codice 1". Le ho fatto eseguire lo stesso comando in un prompt di DOS e ha funzionato bene. Che cosa potrebbe causare questo? C'è un modo per arrivare al vero errore?

Usiamo entrambi Visual Studio 2008.


nel mio caso, la risposta fornita da Tim Scott verso la fine di questa pagina (quindi trascuro all'inizio) risolve il mio problema.
yu yang Jian

Risposte:


115

Aveva uno spazio in uno dei nomi delle cartelle nel suo percorso e nessuna virgoletta intorno.


12
mettere virgolette sui nomi dei percorsi è una buona pratica. non lavorare in percorsi che contengono spazio è evento migliore :-)
Asher

4
copia / y "$ (TargetDir) Dotfuscated \" "$ (TargetDir)" questo comando non funziona per me e se sto scrivendo exit 0 alla fine, funziona bene. puoi dirmi perché?
Rikin Patel

59

Quello con i "ping" mi ha aiutato ... ma può essere spiegato un po 'meglio ...

Per me la soluzione era cambiare:

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

a questa:

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

Spero che funzioni per te. :-)


48

L'ho aggiunto per i futuri visitatori poiché questa è una domanda piuttosto attiva.

ROBOCOPY esce con "codici di successo" inferiori a 8. Vedi: http://support.microsoft.com/kb/954404

Ciò significa che:

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.

Quindi ho risolto facilmente questo problema aggiungendolo in fondo al file batch

exit 0

Suggerisci di gestire gli errori di ROBOCOPY in questo modo

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 confusione si instaura quando nessun file viene copiato = nessun errore in VS. Quindi, quando ci sono modifiche, i file vengono copiati, errori VS ma tutto ciò che lo sviluppatore voleva è stato fatto.

Suggerimento aggiuntivo: non utilizzare una pausa nello script poiché diventerebbe una pausa indefinita nella build VS. mentre sviluppi la sceneggiatura, usa qualcosa come timeout 10. Lo noterai e lo commenterai piuttosto che avere una build sospesa.


4
Proprio quello che stavo cercando. Grazie!!
Ricky

Bumping una risposta vecchia di 8 anni per dire che, se vuoi un file di una riga e non un file bat, puoi aggiungere un "& exit 0" alla fine della stringa dell'evento post-build.
Eric Wu,

46

La ragione per il codice 1 era che la cartella di destinazione era di sola lettura. Spero che questo aiuti qualcuno! Avevo un evento di post build per fare una copia da una directory a un'altra e la destinazione era di sola lettura. Quindi sono andato e ho deselezionato l'attributo di sola lettura nella directory e in tutte le sue sottodirectory! Assicurati solo che sia una directory sicura per farlo!


Mi hai risparmiato un'ora, grazie! Scaricato del codice da Internet e Windows 7 imposta automaticamente la cartella in sola lettura.
Johan Petersson

1
Ho anche usato xcopy invece e con il flag / y. Tutti i comandi microsoft.com/resources/documentation/windows/xp/all/proddocs/…
Johan Petersson


8

Ho dovuto eseguire VS come amministratore per far funzionare la mia copia post-build su un sistema operativo protetto ".. \ Common7 \ IDE \ PrivateAssemblies"


5

Per coloro, che fanno uso di ' copia ' di comando in Eventi di compilazione ( riga di comando eventi pre-compilazione o / e linea di comando eventi post-generazione ) da Progetto -> Proprietà : si ' copiare ' parametri di comando dovrebbe essere simile qui: copy "source of files" "destination for files". Ricordarsi di utilizzare le virgolette (per evitare problemi con gli spazi nelle stringhe di indirizzo).


4

Ho avuto un problema simile, ma in particolare in un ambiente di compilazione Jenkins. Per risolvere il problema, sono passato dall'utilizzo di un comando di copia nell'evento di post-compilazione all'utilizzo di un obiettivo di copia.

Ho cambiato questo:

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

a questa:

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

e ora funziona bene.

L'errore specifico che stavo ricevendo 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]>

Come hai apportato questo cambiamento? L'hai modificato manualmente? Come esegui l'obiettivo? Sembra qualcosa che dovresti specificare nella riga di comando di msbuild. Ho lo stesso identico problema nel mio ambiente jenkins, il che è strano perché tutte le cartelle create da msbuild sono sempre di sola lettura. Perché copia bene sulla mia macchina ma non sul server è al di là di me.
shawn1874

Ho appena usato Notepad ++ per modificare il file csproj. L'hook "AfterBuild" è un hook standard, quindi se esiste, viene chiamato automaticamente dopo il processo di compilazione.
TechSavvySam

Grazie. Non ero sicuro se avessi un file msbuild personalizzato con un obiettivo o se fosse solo il file creato dallo studio visivo. FYI: Nel mio caso ho capito che il problema aveva a che fare con l'ordine di costruzione. Ho dimenticato di impostare le dipendenze di compilazione nella versione, configurazione della soluzione in modo che i progetti venissero compilati sul server in un ordine diverso in modo tale che il file di input non fosse ancora disponibile quando la copia è stata eseguita. Assicurandomi che il file .dll fosse prodotto prima dell'altro progetto che necessitava di risolverlo per me. Questo era un problema molto sottile con la configurazione della soluzione che lo ha causato.
shawn1874

All'inizio non era ovvio che l'ordine di compilazione fosse per ogni configurazione. Ho pensato che fosse più un'impostazione di soluzione, ma evidentemente devi aggiornare l'ordine di compilazione in TUTTE le configurazioni.
shawn1874

3

Sono stato in grado di correggere il mio codice 1 eseguendo Visual Studio come amministratore. Apparentemente non aveva accesso per eseguire i comandi della shell senza Admin.


2

Come una questione di buona pratica, ti suggerisco di sostituire l'evento post build con un'attività di copia file di MS Build .


3
quali sono i vantaggi dell'uno rispetto all'altro?
GregC

2

Per me dovevo assicurarmi che il programma su cui stavo copiando il file non fosse in esecuzione in quel momento. Non c'erano errori nella sintassi. Spero che questo aiuti qualcuno.


2

Ho appena ricevuto lo stesso errore. Avevo un% nel percorso di destinazione che doveva essere evitato

c:\projects\%NotAnEnvironmentVariable%

doveva essere

c:\projects\%%NotAnEnvironmentVariable%%

2

Ok, questo è un problema con molte soluzioni, quindi metto solo il mio per dare alle persone più suggerimenti. La mia situazione è ricontrollare le cartelle nel tuo percorso e assicurarti che esistano tutte nella tua macchina. Ad esempio: "$ (SolutionDir) \ partBin \ Bin \ $ (ProjectName) .pdb", ma "Bin" non si trova nella cartella partBin.


1
BTW, \ after $(SolutionDir)è ridondante.
Diablo

2

Per coloro che utilizzano il comando "copia" negli eventi di compilazione (riga di comando dell'evento di pre-compilazione o / e riga di comando dell'evento di post-compilazione) da Progetto -> Proprietà: la cartella di destinazione dovrebbe esistere


0

Tante soluzioni ...

Nel mio caso, ho dovuto salvare il file bat con codifica non Unicode (Western, Windows). Per impostazione predefinita, quando ho aggiunto il file a Visual Studio (e probabilmente avrei dovuto farlo al di fuori del VS), è stato aggiunto con la codifica UTF-8.


0

Ho avuto lo stesso problema e si è scoperto che era perché avevo rinominato il progetto. Sono entrato nelle proprietà del progetto e ho cambiato il nome dell'assembly e lo spazio dei nomi radice con il nome del progetto, dopodiché ha funzionato alla grande!


0

Ancora un'altra risposta ...

Nel mio caso avevo un progetto Visual Studio 2017 rivolto sia a .Net Standard 1.3 che .Net Framework 2.0. Questo è stato specificato nel file .csproj in questo modo:

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

Avevo anche una riga di comando dell'evento post-build come questa:

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

In altre parole, stavo cercando di copiare il .Net Framework .dll prodotto dalla build in una posizione alternativa.

Questo non funzionava con questo errore quando ho eseguito una ricostruzione:

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

Dopo molta frustrazione ho finalmente stabilito che quello che stava succedendo era che Rebuild aveva cancellato tutti i file di output, quindi ha fatto la build per .Net Standard 1.3, quindi ho provato a eseguire la riga di comando dell'evento post-build, che non è riuscita perché il file da copiare non è stato ancora costruito.

Quindi la soluzione è stata quella di cambiare l'ordine di costruzione, cioè compilare prima per .Net Framework 2.0, poi per .Net Standard 1.3.

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

Questo ora funziona, con il piccolo problema tecnico che la riga di comando dell'evento post-build viene eseguita due volte, quindi il file viene copiato due volte.


0

Nel mio caso ho dovuto cd(cambiare directory) prima di chiamare il file bat, perché all'interno del file bat c'era un'operazione di copia che specificava i percorsi relativi.

:: Copy file
cd "$(ProjectDir)files\build_scripts\"
call "copy.bat"
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.