web-dev-qa-db-fra.com

Visual Studio: plusieurs commandes post-build?

Visual Studio 2008 me permet de déclarer une commande et de la joindre à l'événement post-génération 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 copier des fichiers de deux endroits différents vers deux destinations différentes, le tout dans un seul projet. En d'autres termes, je dois invoquer 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 j'ai besoin d'appeler plusieurs commandes, je devrai placer 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'invoquer deux commandes à partir de l'événement post-génération? Merci d'avance pour votre aide.

90
David Veeneman

Vous pouvez saisir autant de commandes de post-construction que vous le souhaitez. Séparez-les simplement par des sauts de ligne.

Voici un exemple de l'un de mes projets.

Post Build Event Commandline

114
womp

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

par exemple.:

call MyBatch1.bat
call MyBatch2.bat
99
huha

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 sauts de ligne: avec &&, Si la commande précédente a échoué, la prochaine 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ù && Est utile. C'est le scénario, lorsque vous utilisez des feuilles de propriétés pour avoir différentes étapes de post-génération sur différentes machines. VS 2008 ne permet pas de définir directement PostBuildStep 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 une seule ligne, vous pouvez donc utiliser && Pour y avoir plusieurs commandes.

14
Steed

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 de l'une de ces commandes, toute la post-construction échoue et vous devrez donc essayer chaque commande après la construction une à la fois pour déboguer.

11
Lisa

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

8
Indra

Ajout à womp 's answer :

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

%(Command)
echo foo

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

Personnellement, je le fais pour tous les événements de génération , 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.

5
Max Truxa

Dans Visual Studio 2017, vous pouvez le faire:

<PostBuildEvent>
    <Command>
        copy $(TargetPath) $(SolutionDIr)\bin1
        copy $(TargetPath) $(SolutionDIr)\bin2
    </Command>
</PostBuildEvent>
3
Jonathan Weesner

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 exécuter uniquement la première des commandes. La seule approche que j'ai trouvée fonctionnant dans les versions Mac et Windows de Visual Studio consistait à 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 bien sûr également fonctionner pour l'événement PostBuild.

1
Crulex

Il n'y a pas de bonne solution à ce problème. L'idée d'appel provoque l'exécution d'autres scripts. J'ai remarqué que la détection d'erreurs ne fonctionnera pas. Mettez 'exit/b 1' dans FailMe.cmd L'utilisation de 'call FailMe.cmd' dans les étapes de post-construction. Remarquez que la construction n'échoue pas? J'utilise VS 2017 pour construire un projet C #. Essayez-le maintenant avec "FailMe.cmd". La génération signale maintenant une erreur.

Il serait donc préférable de n'utiliser qu'un seul script, si le rapport d'erreurs est important.

1
Richard Meadows