web-dev-qa-db-fra.com

Comment corriger l'erreur MSB3073 dans mon événement post-build?

Je travaille sur un projet qui nécessite que les DLL générées lors de la génération de ma solution soient copiées du dossier bin vers un autre dossier, tous deux situés sur ma machine, dans mon lecteur C. J'ai écrit un fichier de commandes qui utilise xcopy pour accomplir cela, que vous pouvez voir ici:

xcopy /s /y /q "C:\Users\scogan\Documents\Visual Studio 2012\Projects\Organizr\Server\bin\Debug\Organizr.Services.dll" "C:\inetpub\wwwroot\AppServer\bin\"
xcopy /s /y /q "C:\Users\scogan\Documents\Visual Studio 2012\Projects\Organizr\Server\bin\Debug\Organizr.Services.pdb" "C:\inetpub\wwwroot\AppServer\bin\"

Maintenant, j'ai essayé de nombreuses itérations de ce fichier, qui se trouve dans:

C:\Users\scogan\Desktop\CopyFiles.bat

donc ma ligne de commande d'événement post-build ressemble à ceci:

call C:\Users\scogan\Desktop\CopyFiles.bat

J'ai exécuté ce fichier de commandes par lui-même avec deux fichiers texte dans des dossiers sur mon bureau, et cela fonctionne bien. Je l'ai également utilisé tel quel avec les fichiers que je dois copier lui-même, et cela fonctionne également. Cependant, lorsque j'essaie de l'exécuter en tant qu'événement post-génération, j'obtiens cette sortie:

1>  Organizr -> C:\Users\scogan\Documents\Visual Studio 2012\Projects\Organizr\Client\bin\Debug\Organizr.exe
1>  File not found - Organizr.Services.dll
1>  0 File(s) copied
1>  0 File(s) copied
1>  File not found - Organizr.Services.pdb
1>c:\Windows\Microsoft.NET\Framework\v4.0.30319\Microsoft.Common.targets(4291,5): error MSB3073: The command "call C:\Users\scogan\Desktop\CopyFiles.bat" exited with code 4.

J'ai effectué des recherches et constaté que le code d'erreur 4 signifiait «Une erreur d'initialisation s'est produite. La mémoire ou l'espace disque est insuffisant ou vous avez entré un nom de lecteur ou une syntaxe non valide sur la ligne de commande».

J'ai également examiné ce qu'est MSB3073 et je n'ai pas trouvé grand-chose qui puisse m'aider. Donc, ma question est qu'est-ce que je fais mal? Les chemins absolus sont-ils gâchés? Toute aide ici est appréciée.

20
Sean Cogan

En jouant avec différentes propriétés de projet, j’ai trouvé que le problème était l’ordre de construction du projet. Le projet qui a généré les fichiers que je voulais copier était construit second, mais le projet qui exécutait le fichier de commandes en tant qu'événement post-génération était généré first. deuxième projet à la place, et cela fonctionne très bien. Merci pour votre aide, tout le monde, cependant.

21
Sean Cogan

Préférez la tâche "Copier" de MsBuild dans une cible AfterBuild plutôt qu'un événement post-génération.

Ajoutez cette cible dans votre fichier de projet et supprimez PostBuildEvent. 

<Target Name="AfterBuild">
    <Copy SourceFiles="C:\Users\scogan\Documents\Visual Studio 2012\Projects\Organizr\Server\bin\Debug\Organizr.Services.*" 
          DestinationFolder="C:\inetpub\wwwroot\AppServer\bin\" 
          OverwriteReadOnlyFiles="true" 
          SkipUnchangedFiles="false" />
</Target>
13
Nicodemeus

Pour ma part, le problème dans mon cas a été causé par l’utilisation de '/' comme séparateur de répertoire dans une commande copy. Doit utiliser des barres obliques inverses.

8
darda

Dans mon cas, la DLL que je créais en construisant le projet était encore utilisée en arrière-plan. J'ai tué l'application et xcopy a bien fonctionné comme prévu.

4
ashish

Si le problème persiste même après avoir placé la construction après dans le projet correct, essayez d'utiliser "copy" au lieu de xcopy. Cela a fonctionné pour moi.

1
Pandele Florin

C’est trop tard, mais j’ai mis mon expérience à la disposition des personnes qui l’observent plus tard: - Il a été résolu en mettant des guillemets pour poster des commandes de copie, qui contenaient des espaces !!!

Dans Propriétés du projet -> Propriétés de configuration -> Evénements de génération -> Evénement post-génération -> Ligne de commande modifiée 

copier $ (ProjectDir) a\b\c $ (OutputPath)

à

copier "$ (ProjectDir) a\b\c" "$ (OutputPath)" 

1
Zakir

L'erreur spécifiée est liée à l'événement post-construit. D'une manière ou d'une autre, VS tool ne peut pas copier les fichiers dans le dossier de destination. Il peut y avoir plusieurs raisons à cela. Pour vérifier la cause exacte de l'erreur, accédez à Outils> Option> Projet et solution> Construit et exécutez, et remplacez "MsBuild la production du projet en sortie" par "Diagnostic". Cela vous donnera suffisamment d'informations pour détecter le problème réel.

1
Pankaj Chouthmal

Ce que vous devez faire avant d’exécuter la commande copy si vous rencontrez un problème avec la commande copy 

  1. ouvrez la solution en tant qu'administrateur et construisez la solution.
  2. si vous avez un problème du type "0 fichier (s) copié (s)", vérifiez le chemin de votre source et de votre destination. vous utilisez peut-être un mauvais chemin. il serait préférable que vous exécutiez la même commande dans "invite de commande" pour vérifier si cela fonctionne correctement ou non. 
0
suraj kumar

J'ai eu le même problème pour mon projet de test. J'ai découvert pourquoi mon événement post-build ne fonctionnait pas et c'est parce que je copiais des fichiers avant d'exécuter la commande $ (ProjectName) .exe et que certains de ces fichiers étaient requis pour le projet Test lui-même. Par conséquent, il suffit de déplacer $ (ProjectName) .exe en tant que première commande pour résoudre le problème.

0
Awan

J'ai constaté que le problème se produit lorsque plusieurs projets sont construits en parallèle et qu'un ou plusieurs projets tentent de copier les mêmes fichiers, ce qui crée des conditions de concurrence qui entraîneront des erreurs occasionnelles. Alors, comment le résoudre? 

Il y a beaucoup d'options, comme ci-dessus, changer simplement les choses pourrait résoudre le problème pour certaines personnes. Des solutions plus robustes seraient ...

une. Restreignez les fichiers en cours de copie, à la place de xcopy $ (TargetDir) . "... au lieu de faire xcopy" $ (TargetDir) $ (TargetName). * "... 

b. Attrapez l'erreur et réessayez i.e

:loop
xcopy /Y /R /S /J /Q  "$(TargetDir)$(TargetName).*" "somewhere"
if ErrorLevel 1 goto loop

c. Utilisateur robocopy au lieu de xcopy

ré. Vous ne voudrez probablement pas faire cela car cela augmentera vos temps de construction, mais vous pourriez réduire le nombre maximum de générations de projets parallèles à 1 ...  enter image description here

0
Mick

L'événement post-construction (sous Evénements de construction, dans la boîte de dialogue des propriétés) d'un projet importé avait une variable d'environnement non définie. 
Accédez à Control Panel\All Control Panel Items\System\Advanced system settings pour ajouter la variable environment appropriée et ne faites pas plus que le redémarrage de VS2017 a résolu l'erreur.
En outre, à la suite de @Seans et d’autres réponses concernant plusieurs conflits/contentions de projets, créez un dossier temporaire dans le dossier de sortie, comme suit: 

like so

et sélectionnez le projet produisant la sortie préférée:

enter image description here

et build (pas de reconstruction/nettoyage) est une solution rapide.

0
Laurie Stearn

Je l'ai résolu en procédant comme suit: Dans Visual studio, je suis allé dans Projet -> Dépendances de projets.

J'ai sélectionné la solution XXX.Test et lui ai dit que cela dépendait également de la solution XXX pour que les événements post-génération de la solution XXX.Test ne génèrent pas cette erreur (sortie avec le code 4).

Cordialement,

0
Antonin GAVREL