web-dev-qa-db-fra.com

Post Build est sorti avec le code 1

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 "abandonné 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 de se rendre à la vraie erreur?

Nous utilisons tous deux Visual Studio 2008.

103
Tim Scott

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

112
Tim Scott

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. :-)

57
JanBorup

Ma raison pour le code 1 était que le dossier cible était en lecture seule. J'espère que cela aide quelqu'un! J'ai eu un événement post-build pour faire une copie d'un répertoire à un autre et la destination était en lecture seule. Donc, je suis juste allé et 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 qui est sûr de le faire!

45
Shalini

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

ROBOCOPY se ferme 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érez aux erreurs ROBOCOPY de gérer cette méthode

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

Astuce supplémentaire: n'utilisez pas de pause dans le script, car cela deviendrait une pause indéfinie dans la construction du système virtuel. tout en développant le script, utilisez quelque chose comme timeout 10. Vous remarquerez ceci et le commenterez plutôt que d'avoir une version suspendue.

42
Valamas

Get moniteur de processus de SysInternals configurez-le de manière à ce que Lunaverse.DbVerse (dans le champ Path) examine le résultat de l'opération. Il devrait être évident à partir de là ce qui a mal tourné

11
Asher

Je devais exécuter VS en tant qu'administrateur pour obtenir ma copie post-build sur un système d'exploitation protégé "..\Common7\IDE\PrivateAssemblies" pour fonctionner

7
wruckie

Pour ceux qui utilisent la commande 'copie' dans événements de construction (ligne de commande de l'événement de pré-construction ou/et post-construction ligne de commande d'événement) de Projet -> Propriétés: vous 'copie' les paramètres de commande doivent ressembler à ceci: 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).

5
Bohdan Kuts

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é d’utiliser une commande de copie dans l’événement post-build à l’utilisation d’une cible de copie.

J'ai changé ça:

   <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 je recevais é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]>
4
TechSavvySam

J'ai pu réparer mon code 1 en exécutant Visual Studio en tant qu'administrateur. Apparemment, il n'avait pas accès à l'exécution des commandes Shell sans Admin.

3
jdurden

Pour moi, je devais m'assurer que le programme dans lequel je copiais le fichier ne fonctionnait pas à ce moment-là. Il n'y avait pas d'erreur dans la syntaxe. J'espère que ça aide quelqu'un.

2
Richard S.

Par bonne pratique, je vous suggère de remplacer l'événement post-build par un tâche de génération de fichier MS Build .

2
Asher

Ok, c'est un problème avec beaucoup de solutions, alors je poste juste le mien pour donner aux gens plus d'indices. Ma situation est de vérifier deux fois les dossiers de votre chemin et de vous assurer qu'ils existent tous sur votre ordinateur. Par exemple: "$ (SolutionDir)\partBin\Bin\$ (NomProjet) .pdb", mais "Bin" ne se trouve pas dans le dossier partBin.

2
David

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

2
syned

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

c:\projects\%NotAnEnvironmentVariable%

devait être

c:\projects\%%NotAnEnvironmentVariable%%
2
firedfly

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'ai également eu une ligne de commande d'événement post-build comme ceci:

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 fichier .Net Framework .dll produit par la version vers un autre emplacement.

Cela échouait avec cette erreur quand 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, c’était que Rebuild supprimait tous les fichiers de sortie, puis construisait pour .Net Standard 1.3, puis tentait d’exécuter la ligne de commande d’événement post-build, qui échouait à cause du fichier à copier. n'a pas encore été construit.

La solution a donc été 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 problème mineur que la ligne de commande d'événement post-build est exécutée deux fois, donc le fichier est copié deux fois.

0
RenniePet

Dans mon cas, je devais cd (changer de répertoire) avant d'appeler le fichier bat, car il contenait une opération de copie spécifiant des chemins d'accès relatifs.

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

J'avais le 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 d'assembly et l'espace de noms racine en nom de projet et cela a très bien fonctionné par la suite!

0
golgothan3

Tant de solutions ...

Dans mon cas, je devais enregistrer le fichier chauve-souris avec un codage 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 l'encodage UTF-8.

0
Tengiz