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.
la source
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:
la source
Il existe une autre option: vous pouvez séparer les commandes avec
&&
. Par exemplecopy $(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.la source
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.
la source
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.
la source
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:
où
%(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.
la source
exit
instruction batch n'importe où le long de la chaîne entraîne l'arrêt de la chaîne. En effetexit 1
, la construction échoue alors qu'elleexit 0
abandonne simplement l'étape et la construction continue.Dans Visual Studio 2017, vous pouvez faire ceci:
la source
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:
L'exemple ci-dessus utilise l'événement "AfterResolveReferences" mais devrait évidemment également fonctionner pour l'événement PostBuild.
la source
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.
la source
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.
la source