Post Build wurde mit Code 1 beendet

107

Ich habe ein Projekt mit einem Post-Build-Event:

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

Es funktioniert jedes Mal gut auf meinem Computer. Ich habe einen neuen Entwickler, der immer den Fehler "Beendet mit Code 1" erhält. Ich ließ sie den gleichen Befehl in einer DOS-Eingabeaufforderung ausführen, und es funktionierte gut. Was könnte das verursachen? Gibt es eine Möglichkeit, zum eigentlichen Fehler zu gelangen?

Wir verwenden beide Visual Studio 2008.

Tim Scott
quelle
In meinem Fall löst die Antwort, die Tim Scott am Ende dieser Seite gibt (so dass ich sie am Anfang übersehen habe), mein Problem.
Yu Yang Jian

Antworten:

115

Sie hatte ein Leerzeichen in einem der Ordnernamen in ihrem Pfad und keine Anführungszeichen.

Tim Scott
quelle
12
Es ist eine gute Praxis, Pfadnamen in Anführungszeichen zu setzen. Nicht in Pfaden zu arbeiten, die Platz enthalten, ist Ereignis besser :-)
Asher
4
copy / y "$ (TargetDir) Dotfuscated \" "$ (TargetDir)" Dieser Befehl funktioniert bei mir nicht. Wenn ich am Ende Exit 0 schreibe, funktioniert das einwandfrei. Kannst du mir sagen warum?
Rikin Patel
59

Der mit den "Pings" hat mir geholfen ... kann aber etwas besser erklärt werden ...

Für mich war die Lösung zu ändern:

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

dazu:

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

Hoffe es funktioniert bei dir. :-)

JanBorup
quelle
47

Ich habe dies für zukünftige Besucher hinzugefügt, da dies eine ziemlich aktive Frage ist.

ROBOCOPY wird mit "Erfolgscodes" beendet, die unter 8 liegen. Siehe: http://support.microsoft.com/kb/954404

Dies bedeutet, dass:

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.

Also habe ich das einfach gelöst, indem ich es am Ende der Batch-Datei hinzugefügt habe

exit 0

Schlagen Sie vor, ROBOCOPY-Fehler auf diese Weise zu behandeln

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    

Verwirrung entsteht, wenn keine Dateien kopiert werden = kein Fehler in VS. Wenn dann Änderungen vorgenommen werden, werden Dateien kopiert, VS-Fehler, aber alles, was der Entwickler wollte, wurde getan.

Zusätzlicher Tipp: Verwenden Sie keine Pause im Skript, da dies zu einer unbestimmten Pause im VS-Build führen würde. Verwenden Sie während der Entwicklung des Skripts so etwas wie timeout 10. Sie werden dies bemerken und auskommentieren, anstatt einen hängenden Build zu haben.

Valamas
quelle
4
Genau das, wonach ich gesucht habe. Vielen Dank!!
Ricky
Wenn Sie eine 8 Jahre alte Antwort eingeben, um zu sagen, dass Sie, wenn Sie einen Einzeiler und keine Bat-Datei möchten, am Ende der Ereigniszeichenfolge nach dem Erstellen ein "& exit 0" hinzufügen können.
Eric Wu
46

Mein Grund für den Code 1 war, dass der Zielordner schreibgeschützt war. Hoffe das hilft jemandem! Ich hatte ein Post-Build-Ereignis, um eine Kopie von einem Verzeichnis in ein anderes zu erstellen, und das Ziel war schreibgeschützt. Also habe ich einfach das schreibgeschützte Attribut für das Verzeichnis und alle seine Unterverzeichnisse deaktiviert! Stellen Sie einfach sicher, dass es sich um ein sicheres Verzeichnis handelt!

Shalini
quelle
Hat mir eine Stunde gespart, danke! Durch das Herunterladen von Code aus dem Internet und Windows 7 wird der Ordner automatisch schreibgeschützt.
Johan Petersson
1
Ich habe stattdessen auch xcopy und mit dem Flag / y verwendet. Alle Befehle microsoft.com/resources/documentation/windows/xp/all/proddocs/…
Johan Petersson
11

Holen Sie sich den Prozessmonitor von SysInternals und richten Sie ihn so ein, dass er nach dem Lunaverse.DbVerse (im Feld Pfad) sucht, um das Operationsergebnis anzuzeigen. Von dort sollte klar sein, was schief gelaufen ist

Asher
quelle
8

Ich musste VS als Administrator ausführen, damit meine Post-Build-Kopie auf ein Betriebssystem mit dem Schutz ".. \ Common7 \ IDE \ PrivateAssemblies" funktioniert

wruckie
quelle
5

Für diejenigen, die ‚verwenden Kopie ‘ im Buildereignis ( Pre-Build - Ereignis Befehlszeile oder / und Postbuildereignis Befehlszeile ) von Projekt -> Eigenschaften : Sie ‚ Kopieren ‘ Befehlsparameter sollen wie hier aussehen: copy "source of files" "destination for files". Denken Sie daran, Anführungszeichen zu verwenden (um Probleme mit Leerzeichen in Adresszeichenfolgen zu vermeiden).

Bohdan Kuts
quelle
4

Ich hatte ein ähnliches Problem, aber speziell in einer Jenkins-Build-Umgebung. Um das Problem zu beheben, habe ich von einem Kopierbefehl im Post-Build-Ereignis zu einem Kopierziel gewechselt.

Ich habe das geändert:

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

dazu:

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

und es funktioniert jetzt gut.

Der spezifische Fehler, den ich bekam, war:

(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
quelle
Wie haben Sie diese Änderung vorgenommen? Haben Sie das manuell bearbeitet? Wie führen Sie das Ziel aus? Das sieht nach etwas aus, das Sie in der msbuild-Befehlszeile angeben müssen. Ich habe genau das gleiche Problem in meiner Jenkins-Umgebung, was seltsam ist, da alle von msbuild erstellten Ordner immer schreibgeschützt sind. Warum es gut auf meinem Computer, aber nicht auf dem Server kopiert, ist mir ein Rätsel.
shawn1874
Ich habe gerade Notepad ++ verwendet, um die csproj-Datei zu bearbeiten. Der "AfterBuild" -Hook ist ein Standard-Hook. Wenn er vorhanden ist, wird er nach dem Erstellungsprozess automatisch aufgerufen.
TechSavvySam
Vielen Dank. Ich war mir nicht sicher, ob Sie eine benutzerdefinierte msbuild-Datei mit einem Ziel hatten oder ob es sich nur um die von Visual Studio erstellte Datei handelte. Zu Ihrer Information: In meinem Fall habe ich herausgefunden, dass das Problem mit der Build-Reihenfolge zu tun hat. Ich habe vergessen, die Build-Abhängigkeiten in der Release- und Lösungskonfiguration festzulegen, sodass die Projekte in einer anderen Reihenfolge auf dem Server erstellt wurden, sodass die Eingabedatei zum Zeitpunkt der Ausführung der Kopie noch nicht verfügbar war. Stellen Sie sicher, dass die DLL vor dem anderen Projekt erstellt wurde, das sie benötigt, und beheben Sie sie für mich. Das war ein sehr subtiles Problem mit der Lösungskonfiguration, die es verursacht hat.
shawn1874
Es war zunächst nicht offensichtlich, dass die Erstellungsreihenfolge für jede Konfiguration gilt. Ich dachte, das wäre eher eine Lösungseinstellung, aber offensichtlich müssen Sie die Erstellungsreihenfolge in ALLEN Konfigurationen aktualisieren.
shawn1874
3

Ich konnte meinen Code 1 reparieren, indem ich Visual Studio als Admin ausführte. Anscheinend hatte es keinen Zugriff, um die Shell-Befehle ohne Admin auszuführen.

jdurden
quelle
2

Aus bewährten Gründen empfehle ich, das Post-Build-Ereignis durch eine MS Build File Copy-Aufgabe zu ersetzen .

Asher
quelle
3
Was sind die Vorteile des einen gegenüber dem anderen?
GregC
2

Für mich musste ich sicherstellen, dass das Programm, in das ich die Datei kopierte, zu diesem Zeitpunkt nicht ausgeführt wurde. Es gab keine Fehler in der Syntax. Hoffe das hilft jemandem.

Richard S.
quelle
2

Ich habe gerade den gleichen Fehler erhalten. Ich hatte ein% im Zielpfad, das maskiert werden musste

c:\projects\%NotAnEnvironmentVariable%

musste sein

c:\projects\%%NotAnEnvironmentVariable%%
Feuerfliege
quelle
2

Ok, das ist ein Problem mit vielen Lösungen, also poste ich nur meine, um den Leuten mehr Hinweise zu geben. Meine Situation besteht darin, die Ordner in Ihrem Pfad zu überprüfen und sicherzustellen, dass alle auf Ihrem Computer vorhanden sind. Beispiel: "$ (SolutionDir) \ partBin \ Bin \ $ (Projektname) .pdb", aber "Bin" befindet sich nicht im Ordner "partBin".

David
quelle
1
Übrigens ist \ after $(SolutionDir)redundant.
Diablo
2

Für diejenigen, die den Befehl 'copy' in Build Events (Befehlszeile für Ereignisse vor dem Erstellen oder / und Befehlszeile für Ereignisse nach dem Erstellen) unter Projekt -> Eigenschaften verwenden: Der Zielordner sollte vorhanden sein

synchronisiert
quelle
0

So viele Lösungen ...

In meinem Fall musste ich die bat-Datei mit einer Nicht-Unicode-Codierung (Western, Windows) speichern. Wenn ich die Datei zu Visual Studio hinzufügte (und wahrscheinlich hätte ich sie außerhalb des VS ausführen sollen), wurde sie standardmäßig mit UTF-8-Codierung hinzugefügt.

Tengiz
quelle
0

Ich hatte das gleiche Problem und es stellte sich heraus, dass ich das Projekt umbenannt hatte. Ich ging in die Projekteigenschaften und änderte den Assembly-Namen und den Root-Namespace in den Projektnamen. Danach funktionierte es hervorragend!

golgothan3
quelle
0

Noch eine Antwort ...

In meinem Fall hatte ich ein Visual Studio 2017-Projekt, das sowohl auf .Net Standard 1.3 als auch auf .Net Framework 2.0 abzielte. Dies wurde in der .csproj-Datei wie folgt angegeben:

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

Ich hatte auch eine Post-Build-Ereignisbefehlszeile wie diese:

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

Mit anderen Worten, ich habe versucht, die vom Build erzeugte .NET Framework-DLL an einen alternativen Speicherort zu kopieren.

Dies ist mit diesem Fehler fehlgeschlagen, als ich einen Rebuild durchgeführt habe:

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

Nach langem Frust stellte ich schließlich fest, dass Rebuild alle Ausgabedateien löschte, dann den Build für .Net Standard 1.3 durchführte und dann versuchte, die Ereignisbefehlszeile nach dem Build auszuführen, was fehlschlug, weil die Datei kopiert werden musste wurde noch nicht gebaut.

Die Lösung bestand also darin, die Erstellungsreihenfolge zu ändern, dh zuerst für .Net Framework 2.0 und dann für .Net Standard 1.3 zu erstellen.

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

Dies funktioniert jetzt mit dem kleinen Fehler, dass die Befehlszeile für Ereignisse nach dem Build zweimal ausgeführt wird, sodass die Datei zweimal kopiert wird.

RenniePet
quelle
0

In meinem Fall musste ich cd(das Verzeichnis wechseln), bevor ich die bat-Datei aufrief, da sich in der bat-Datei eine Kopieroperation befand, die relative Pfade spezifizierte.

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