Faire pré - et post-événement de construction des scripts assez?
J'ai quelques moyennement lourde pré - et post-événement de construction de scripts pour mon Visual Studio 2008 projets (en fait c'est surtout après la construction de scripts d'événement). Ils fonctionnent bien dans qu'ils fonctionnent correctement et quand je exit 0
la génération réussit et quand je exit 1
la compilation échoue avec une erreur. Cependant, cette erreur est énorme, et il va quelque chose comme ceci:
The command "if Release == Debug goto Foo
if Release == Release goto Bar
exit 0
:Foo
mkdir "abc"
copy "$(TargetDir)file.dll" "abc"
[...]
" exited with code 1.
Vous obtenez l'idée. L'intégralité du script est toujours sous-évaluées dans le cadre de la description de l'erreur. L'intégralité du script est également déversés dans la fenêtre de Sortie tandis que la compilation se passe, trop. Alors, pourquoi ai-je vu plusieurs références sur le web à l'aide de echo
dans ces scripts? Par exemple, voici une partie d'un exemple sur un site en particulier:
:BuildEventFailed
echo POSTBUILDSTEP for $(ProjectName) FAILED
exit 1
:BuildEventOK
echo POSTBUILDSTEP for $(ProjectName) COMPLETED OK
Est-il un moyen pour obtenir Visual Studio pour supprimer tous les script de sortie en dehors de ce qui est echo
ed (et par conséquent l'utilisation de echo
seulement la production de ce que vous voulez serait logique), ou sont ces exemples seulement fausse route et qu'ils ne se rendent pas compte que le scénario est toujours sous-évaluées?
OriginalL'auteur Jez | 2011-06-07
Vous devez vous connecter pour publier un commentaire.
OK, le cœur du problème semble être que le Visual Studio C++ et C# construire les moteurs sont assez différentes.
La génération C++ du moteur exécute le batch code indiqué dans le projet de pré - ou de post-construction de l'événement 'Ligne de Commande' sans dumping, le code de la fenêtre de Sortie; il vient de se déverse qu'est-ce que
echo
ed par le code, ainsi que ce qui est envoyé par les commandes de l'exécution de code (comme lecopy
de la commande '2 fichier(s) copié", etc.) Les exemples que j'ai vu sur le web sont probablement destinées à Visual Studio C++ moteur de construction, car il n'est pas besoin de vraiment faire écho à quelque chose avec le C# moteur de construction si vous mettez votre C# pré - ou post-build code de lot dans le projet C# de l'événement de la ligne de commande".C'est parce que le C# moteur de construction, de qui j'ai été en utilisant, ne dump tout le code dans la case de la fenêtre de Sortie. De plus, si le code ne fonctionne pas, il comprend l'ensemble du bloc de code dans la boîte dans le message d'erreur qui apparaît dans la "Liste d'Erreurs" - la génération C++ du moteur n'est pas (plus sur cela plus tard).
La meilleure solution que j'ai trouvé, par conséquent, est de réduire la quantité de code que vous mettez dans un projet C# pré - ou post-événement de construction de la ligne de commande de la boîte. Tout ce que vous mettez dans il SERA exportée vers la fenêtre de Sortie telle qu'elle est exécutée. Le meilleur moyen de minimiser le code, il existe pour exécuter un fichier de commandes, et de passer les arguments nécessaires pour le fichier de commandes. Le contenu du fichier de commandes ne seront PAS l'objet de dumping dans la fenêtre de Sortie, mais (comme avec le code de la 'Ligne de Commande' pour la génération C++ du moteur)
echo
de sortie et la sortie à partir des commandes du fichier de commandes code s'exécute, c'est un bon moyen pour contrôler la sortie en C# d'un pré - ou post-script de construction. La génération C++ du moteur, ensuite, est le traitement le code indiqué dans la "Ligne de Commande" dans la boîte de la même manière que le C# moteur de traite de code dans un fichier de commandes; il n'a pas de dump sur le code lui-même, juste le code de sortie.Donc, fondamentalement, si vous êtes à la compilation d'un projet C++ dans Visual Studio, vous pouvez simplement mettre tout le lot de script en Ligne de Commande de boîte et ce ne sera pas l'objet de dumping dans la fenêtre de Sortie. Si la compilation d'un projet C#, cependant, je recommande de mettre votre script batch dans un autre
.bat
fichier, et juste d'appeler ce fichier avec les arguments appropriés, à partir de la pré - ou post-événement de construction de la ligne de commande de la boîte. J'ai fini avec mon C# post-événement de construction de ligne de commande de boîte qui ressemble à ceci:... et mon PostBuild.fichier bat qui ressemble à ceci:
Ce contrôle de la sortie beaucoup plus soigneusement, et que des choses
echo
ed dans ce lot script sera de sortie dans la fenêtre de Sortie.Enfin, comme mentionné ci-dessus, le C# et C++ construire des moteurs de la sortie des choses différentes dans le message d'erreur qui apparaît dans la "Liste d'Erreurs", alors que l'après-construire le traitement échoue (c'est à dire. le code de lot se termine avec un code autre que
0
). La génération C++ du moteur semble toujours dire:Le C# moteur de construction, cependant, comprendra la totalité du contenu de la pré - ou post-événement de construction de la ligne de commande de la boîte (selon ce qui a échoué) dans le message d'erreur, par exemple.:
Encore un peu d'une bouchée pour un seul message d'erreur, mais beaucoup plus facile à gérer que d'avoir tout le code, nous avons déménagé dans le fichier de commandes inclus dans le message d'erreur!
Même alors, il serait agréable de pouvoir personnaliser ce message d'erreur qui s'affiche dans la Liste d'Erreurs pour afficher quelque chose que j'définir. Je doute que ce soit possible, mais si quelqu'un connait un moyen de le faire, s'il vous plaît n'hésitez pas à poster un commentaire!
OriginalL'auteur Jez
Si vous mettez vos scripts dans un fichier de commandes, VS est assez silencieuse à ce sujet. Lorsque vous avez besoin de l'accès à l' $(projectName), etc vous aurez à passer en paramètres pour le fichier de commandes. J'ai regardé pour les paramètres qui peuvent affecter la sortie, mais ne pouvais pas trouver toutes.
Testé avec ce fichier de commandes (d:\test.bat); la @echo off n'est même pas nécessaire:
Ensemble
Pre-Build Event->Command Line
à d:\test.bat, laissezDescription
vide (la description est ce qui est affiché à la place de Exécution de Pré-Événement de construction.... Dans VS2008, je reçois ce dans la construction de la fenêtre de sortie pour un projet C++:Pour un projet C#, c'est affiché à la place (avec
MSBuild verbosity
ensemble de normal):Performing Pre-Build Event...
dans ma sortie. Quelle est la version de Visual Studio que vous utilisez? Aussi, vous pouvez coller l'intégralité du contenu de votre "Pré-événement de construction de la ligne de commande' le contenu de la fenêtre?mise à jour de la réponse. Vous pouvez poster ce que vous utilisez dans la ligne de commande exactement? J'ai essayé plusieurs choses mais je n'arrivais pas à afficher la totalité de la ligne de commande
Ahhh... la vôtre a été une génération C++, et je suis en construction d'un projet C#, ce qui explique pourquoi je ne vois pas le
Performing Pre-Build Event
de sortie. Je vois que le deuxième. Je vais essayer de l'exécuter une .le fichier bat et voir ce qui se passe. Je ne comprends pas très bien ce que tu veux dire par "je n'arrivais pas à afficher la totalité de la ligne de commande'. Votre ligne de commande estd:\test.bat
; c'est l'affichage de l'ensemble de la ligne de commande de votre sortie, n'est-il pas (pour le C#)?et bien j'ai essayé des choses comme
if $(Configuration) == Release call d:\test.bat
mais il n'a toujours pas d'affichage que l'ensemble de la ligne.Êtes-vous sûr que vous êtes la construction d'un projet C#? Il a certainement me donne tout le toutim dans ma Sortie (mais pas le contenu de l' .fichier bat):
Target PostBuildEvent: ..\..\BuildScripts\CampusPostBuild.bat Release C:\dev\[my other args here...]
OriginalL'auteur stijn
@Jez votre réponse est très bien, mais je voudrais améliorer le fichier de commandes comme suit:
En utilisant %~1 il va supprimer les citations de args plus facilement:
OriginalL'auteur Apfelkuacha