Post Build terminé avec le code 1

108

J'ai un projet avec un événement post build:

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

Cela fonctionne bien à chaque fois sur ma machine. J'ai un nouveau développeur qui obtient toujours l'erreur "sorti avec le code 1". Je lui ai fait exécuter la même commande dans une invite DOS, et cela a bien fonctionné. Qu'est-ce qui peut causer cela? Y a-t-il un moyen d'arriver à la vraie erreur?

Nous utilisons tous les deux Visual Studio 2008.

Tim Scott
la source
dans mon cas, la réponse fournie par Tim Scott vers la fin de cette page (donc j'oublie au début) résout mon problème.
yu yang Jian

Réponses:

115

Elle avait un espace dans l'un des noms de dossier dans son chemin, et pas de guillemets autour.

Tim Scott
la source
12
mettre des guillemets sur les noms de chemin est une bonne pratique. ne fonctionne pas dans les chemins contenant de l'espace, c'est mieux l'événement :-)
Asher
4
copier / y "$ (TargetDir) Dotfuscated \" "$ (TargetDir)" cette commande ne fonctionne pas pour moi et si j'écris la sortie 0 à la fin, cela fonctionne bien. peux-tu me dire pourquoi?
Rikin Patel
59

Celui avec les "Pings" m'a aidé ... mais peut être expliqué un peu mieux ...

Pour moi, la solution était de changer:

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

pour ça:

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

J'espère que ça marche pour toi. :-)

JanBorup
la source
48

J'ai ajouté ceci pour les futurs visiteurs car c'est une question assez active.

ROBOCOPY se termine avec des «codes de réussite» inférieurs à 8. Voir: http://support.microsoft.com/kb/954404

Cela signifie 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.

J'ai donc résolu ce problème facilement en l'ajoutant au bas du fichier de commandes

exit 0

Suggérer de gérer les erreurs ROBOCOPY de cette façon

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 confusion s'installe lorsqu'aucun fichier n'est copié = aucune erreur dans VS. Ensuite, quand il y a des changements, les fichiers sont copiés, les erreurs VS mais tout ce que le développeur voulait a été fait.

Conseil supplémentaire: n'utilisez pas de pause dans le script car cela deviendrait une pause indéfinie dans la version VS. lors du développement du script, utilisez quelque chose comme timeout 10. Vous le remarquerez et le commenterez plutôt que d'avoir une version suspendue.

Valamas
la source
4
Exactement ce que je cherchais. Merci!!
Ricky
Cogner une réponse vieille de 8 ans pour dire que, si vous voulez un fichier à une seule ligne, et non un fichier bat, vous pouvez ajouter un "& exit 0" à la fin de la chaîne d'événement post-construction.
Eric Wu le
46

Ma raison pour le code 1 était que le dossier cible était en lecture seule. J'espère que cela aide quelqu'un! J'avais un événement post build pour faire une copie d'un répertoire à un autre et la destination était en lecture seule. Alors je suis juste allé et j'ai décoché l'attribut en lecture seule sur le répertoire et tous ses sous-répertoires! Assurez-vous simplement que c'est un répertoire sûr pour le faire!

Shalini
la source
M'a sauvé une heure, merci! Le code téléchargé sur Internet et Windows 7 définit automatiquement le dossier en lecture seule.
Johan Petersson
1
J'ai également utilisé xcopy à la place et avec le drapeau / y. Toutes les commandes microsoft.com/resources/documentation/windows/xp/all/proddocs/…
Johan Petersson
11

Obtenez le moniteur de processus de SysInternals et configurez-le pour surveiller le Lunaverse.DbVerse (dans le champ Chemin) et le résultat de l'opération. Il devrait être évident à partir de là ce qui n'a pas fonctionné

Asher
la source
8

J'ai dû exécuter VS en tant qu'administrateur pour que ma copie post-construction sur un système d'exploitation protégé ".. \ Common7 \ IDE \ PrivateAssemblies" fonctionne

wruckie
la source
5

Pour ceux qui utilisent « copie » commande dans Événements de génération ( ligne de commande événement pré-construction ou / et ligne de commande événement post-build ) de projet -> Propriétés : vous « copier » paramètres de commande doit ressembler ici: copy "source of files" "destination for files". N'oubliez pas d'utiliser des guillemets (pour éviter les problèmes d'espaces dans les chaînes d'adresse).

Bohdan Kuts
la source
4

J'ai eu un problème similaire, mais spécifiquement dans un environnement de construction Jenkins. Pour résoudre le problème, je suis passé de l'utilisation d'une commande de copie dans l'événement post build à l'utilisation d'une cible de copie.

J'ai changé ceci:

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

pour ça:

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

et cela fonctionne bien maintenant.

L'erreur spécifique que j'obtenais était:

(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
la source
Comment avez-vous fait ce changement? Avez-vous modifié cela manuellement? Comment exécutez-vous la cible? Cela ressemble à quelque chose que vous devez spécifier dans la ligne de commande msbuild. J'ai exactement le même problème dans mon environnement jenkins, ce qui est étrange car tous les dossiers créés par msbuild sont toujours en lecture seule. Pourquoi il copie bien sur ma machine mais pas sur le serveur me dépasse.
shawn1874
Je viens d'utiliser Notepad ++ pour éditer le fichier csproj. Le hook "AfterBuild" est un hook standard, donc s'il existe, il est appelé automatiquement après le processus de construction.
TechSavvySam
Merci. Je ne savais pas si vous aviez un fichier msbuild personnalisé avec une cible ou s'il s'agissait simplement du fichier créé par Visual Studio. FYI: Dans mon cas, j'ai compris que le problème était lié à l'ordre de construction. J'ai oublié de définir les dépendances de construction dans la version, la configuration de la solution afin que les projets se construisent sur le serveur dans un ordre différent de sorte que le fichier d'entrée n'était pas encore disponible lorsque la copie a été exécutée. S'assurer que le .dll a été produit avant l'autre projet qui en avait besoin l'a corrigé pour moi. C'était un problème très subtil avec la configuration de la solution qui l'a causé.
shawn1874
Il n'était pas évident d'être au début que l'ordre de construction est pour chaque configuration. Je pensais que c'était plus un paramètre de solution, mais de toute évidence, vous devez mettre à jour l'ordre de construction dans TOUTES les configurations.
shawn1874
3

J'ai pu corriger mon code 1 en exécutant Visual Studio en tant qu'administrateur. Apparemment, il n'avait pas accès pour exécuter les commandes shell sans Admin.

jdurden
la source
2

Par bonne pratique, je vous suggère de remplacer l'événement post build par une tâche MS Build File Copy .

Asher
la source
3
quels sont les avantages de l'un par rapport à l'autre?
GregC
2

Pour moi, je devais m'assurer que le programme auquel je faisais face ne fonctionnait pas à ce moment-là. Il n'y avait aucune erreur dans la syntaxe. J'espère que cela aide quelqu'un.

Richard S.
la source
2

Je viens de recevoir la même erreur. J'avais un% dans le chemin de destination qui devait être échappé

c:\projects\%NotAnEnvironmentVariable%

besoin d'être

c:\projects\%%NotAnEnvironmentVariable%%
mouche
la source
2

Ok, c'est un problème avec de nombreuses solutions, donc je poste juste le mien pour donner plus d'indices aux gens. Ma situation est de vérifier les dossiers dans votre chemin et de m'assurer qu'ils existent tous sur votre machine. Par exemple: "$ (SolutionDir) \ partBin \ Bin \ $ (ProjectName) .pdb", mais "Bin" n'est pas dans le dossier partBin.

David
la source
1
BTW, \ after $(SolutionDir)est redondant.
Diablo
2

Pour ceux qui utilisent la commande `` copier '' dans les événements de construction (ligne de commande d'événement de pré-construction ou / et ligne de commande d'événement de post-construction) à partir de Projet -> Propriétés: le dossier cible doit exister

synchronisé
la source
0

Tant de solutions ...

Dans mon cas, j'ai dû enregistrer le fichier bat avec un encodage non-unicode (Western, Windows). Par défaut, lorsque j'ai ajouté le fichier à Visual Studio (et j'aurais probablement dû le faire en dehors du VS), il a été ajouté avec un encodage UTF-8.

Tengiz
la source
0

J'ai eu ce même problème et il s'est avéré que c'était parce que j'avais renommé le projet. Je suis allé dans les propriétés du projet et j'ai changé le nom de l'assembly et l'espace de noms racine en nom de projet et cela a très bien fonctionné après cela!

golgothan3
la source
0

Encore une autre réponse ...

Dans mon cas, j'avais un projet Visual Studio 2017 ciblant à la fois .Net Standard 1.3 et .Net Framework 2.0. Cela a été spécifié dans le fichier .csproj comme ceci:

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

J'avais également une ligne de commande d'événement post-build comme celle-ci:

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

En d'autres termes, j'essayais de copier le .Net Framework .dll produit par la construction vers un autre emplacement.

Cela a échoué avec cette erreur lorsque j'ai fait une reconstruction:

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

Après beaucoup de frustration, j'ai finalement déterminé que ce qui se passait était que Rebuild supprimait tous les fichiers de sortie, puis faisait la construction pour .Net Standard 1.3, puis essayait d'exécuter la ligne de commande de l'événement post-construction, qui a échoué car le fichier à copier n'était pas encore construit.

La solution était donc de changer l'ordre de construction, c'est-à-dire de construire d'abord pour .Net Framework 2.0, puis pour .Net Standard 1.3.

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

Cela fonctionne maintenant, avec le petit problème que la ligne de commande de l'événement post-construction est exécutée deux fois, donc le fichier est copié deux fois.

RenniePet
la source
0

Dans mon cas, j'ai dû cd(changer de répertoire) avant d'appeler le fichier bat, car à l'intérieur du fichier bat se trouvait une opération de copie qui spécifiait des chemins relatifs.

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