Visual Studio: plusieurs commandes post-build?

101

Visual Studio 2008 me permet de déclarer une commande et de l'attacher à l'événement post-build d'un projet. Comme beaucoup de développeurs, je l'utilise régulièrement pour xcopier des fichiers dans le répertoire de sortie de l'application.

Je travaille sur un projet où j'ai besoin de xcopier des fichiers de deux endroits différents vers deux destinations différentes, le tout dans un seul projet. En d'autres termes, je dois appeler deux commandes xcopy différentes à partir du même événement post-build. Il semble que l'événement post-build ne prendra qu'une seule commande, et que si je dois appeler plusieurs commandes, je devrai mettre les commandes dans un fichier * .bat et l'appeler à partir de l'événement post-build.

Est-ce correct, ou existe-t-il un moyen plus simple d'appeler deux commandes à partir de l'événement post-build? Merci d'avance pour votre aide.

David Veeneman
la source

Réponses:

124

Vous pouvez saisir autant de commandes de post-build que vous le souhaitez. Séparez-les simplement par des nouvelles lignes.

Voici un exemple de l'un de mes projets.

Ligne de commande de l'événement post-build

womp
la source
3
Inclure une capture d'écran n'est utile que si vous avez l'intention de l'héberger pour toujours.
Amandalishus
1
@ OWenJ23 ... ou 'imageshack' dans ce cas;)
Anthony Walsh
28
Bien qu'elles soient sur des lignes séparées, mes commandes sont exécutées ensemble comme si elles étaient sur une seule ligne.
Trevor
6
Malheureusement, il semble qu'au moins VS2015 ne signale pas d'erreur si l'une des commandes intermédiaires échoue ... il rapporte le résultat de la dernière commande à la suite de l'étape de post-construction.
Johannes S.
3
Il semble que cela fonctionne à l'intérieur de Visual Studio - mais n'est pas pris en charge si vous utilisez MsBuild sur une machine de génération TFS. MsBuild supprime les sauts de ligne, puis échoue la commande en raison d'une mauvaise syntaxe.
Jeff B
107

Important: lors de l'exécution d'un fichier batch, vous devez utiliser l'instruction "call" pour exécuter les lignes suivantes. Si vous n'utilisez pas "call", l'exécution va dans le .bat et ne retourne pas aux lignes suivantes. Identique à l'invite DOS.

par exemple:

call MyBatch1.bat
call MyBatch2.bat
huha
la source
3
Cette astuce s'applique aux commandes grunt et npm car elles s'exécutent toutes les deux via des fichiers batch (grunt.cmd et npm.cmd).
Matt Varblow
16

Il existe une autre option: vous pouvez séparer les commandes avec &&. Par exemple

copy $(TargetPath) d:\folder1 && copy $(TargetPath) d:\folder2

Ce n'est pas exactement la même chose que la séparation avec des retours à la ligne: avec &&, si la commande précédente a échoué, le prochain commant ne s'exécutera pas.

La séparation par des retours à la ligne est plus facile à lire, vous devriez donc la préférer. Cependant je connais au moins un cas où &&c'est utile. C'est le scénario, lorsque vous utilisez des feuilles de propriétés pour avoir différentes étapes de post-construction sur différentes machines. VS 2008 ne permet pas de définir PostBuildStep directement dans les feuilles de propriétés, mais vous pouvez ajouter une macro utilisateur avec votre commande et l'appeler à partir des paramètres principaux du projet. Une macro est sur une seule ligne, vous pouvez donc l'utiliser &&pour y avoir plusieurs commandes.

Coursier
la source
11

Chaque commande doit être sur une ligne distincte. Ce que j'ai trouvé cependant, c'est que s'il y a une erreur lors de l'exécution d'une de ces commandes, toute la post-construction échoue et vous devrez donc essayer chaque commande de post-construction une par une pour déboguer.

Lisa
la source
2
"xcopy / f" affichera le nom complet du fichier source et cible, qui sera imprimé avant l'échec, rendant plusieurs commandes xcopy plus faciles à diagnostiquer que plusieurs commandes de copie.
yoyo le
9

Séparer les commandes avec & ou && ou; ne fonctionne pas dans VS2017. Je ne peux pas croire qu'une fonctionnalité aussi simple ne soit pas disponible dans VS2017. Visual Studio essaie d'exécuter l'intégralité du texte dans la fenêtre d'événement de post-génération sous la forme d'une seule chaîne. La seule option pour moi maintenant est de créer un script batch que je n'aime pas particulièrement.

Indra
la source
1
Séparer les commandes avec && fonctionne pour moi dans VS2017. Spécifier chaque commande sur une ligne distincte dans l'éditeur VS2017 ne fonctionne pas pour moi.
codesniffer
5

Ajout de womp de réponse :

Si vous avez plusieurs feuilles de propriétés avec quelque chose à faire sur le même événement de construction, vous pouvez effectuer les opérations suivantes pour enchaîner les commandes:

%(Command)
echo foo

%(Command) développe jusqu'à la valeur précédente de la commande.

Personnellement, je le fais pour tous les événements de construction, même si je n'ai actuellement pas de commandes héritées, car cela garantit qu'il n'y aura aucun problème si j'ajoute des feuilles de propriétés plus tard.

Max Truxa
la source
1
Cela fonctionne également avec l'étape de construction personnalisée. En outre, l'exécution d'une exitinstruction batch n'importe où le long de la chaîne entraîne l'arrêt de la chaîne. En effet exit 1, la construction échoue alors qu'elle exit 0abandonne simplement l'étape et la construction continue.
Martin Connell
3

Dans Visual Studio 2017, vous pouvez faire ceci:

<PostBuildEvent>
    <Command>
        copy $(TargetPath) $(SolutionDIr)\bin1
        copy $(TargetPath) $(SolutionDIr)\bin2
    </Command>
</PostBuildEvent>
Jonathan Weesner
la source
1
J'ai édité le .csproj et ajouté <Command> </Command> autour de mes deux commandes d'événement postbuild. Cela ne semblait pas fonctionner. Quand j'ai regardé dans Build Events dans Visual Studio, il y avait la <Command> </Command> autour des deux commandes, mais a donné une erreur de construction: La commande "<Command xmlns =" ​​.. "> command1 command2 </Command>" sorti avec le code 255.
Jimmy
1

L'approche suggérée par womp fonctionne dans Visual Studio 2015/2017 (Windows), mais ne fonctionne pas dans Visual Studio pour Mac (Aperçu), qui semble n'exécuter que la première des commandes. La seule approche que j'ai trouvée fonctionnant à la fois dans les versions Mac et Windows de Visual Studio était de chaîner 2 commandes MSBuild:

<Target Name="AfterResolveReferences">
<Exec Command="path\MyFirstCommand.exe -parameters" />
</Target>
<Target Name="MySecondCommand" AfterTargets="AfterResolveReferences" >
<Exec Command="path\MySecondCommand.exe -parameters" />
</Target>

L'exemple ci-dessus utilise l'événement "AfterResolveReferences" mais devrait évidemment également fonctionner pour l'événement PostBuild.

Crulex
la source
1

Il n'y a pas de bonne solution à ce problème. L'idée d'appel entraîne l'exécution d'autres scripts. J'ai remarqué que la détection d'erreur ne fonctionnera pas. Mettez 'exit / b 1' dans FailMe.cmd. Utilisez 'call FailMe.cmd' dans les étapes de post-construction. Remarquez que la construction n'échoue pas? J'utilise VS 2017 pour créer un projet C #. Maintenant, essayez-le avec 'FailMe.cmd' La compilation signale maintenant une erreur.

Vous feriez donc peut-être mieux d'utiliser un seul script, si le rapport d'erreur est important.

Richard Meadows
la source
-4

Préfixez simplement "appel" à votre script batch. Ainsi, les instructions sous le script Batch sont également exécutées après le renvoi de l'appel à partir du script batch.

call Script1.cmd
call Script2.bat
msKing
la source