web-dev-qa-db-fra.com

Comment créer un script de construction simple pour Visual Studio à partir de la ligne de commande?

J'ai beaucoup de solutions de projet Visual Studio dans plusieurs répertoires (tous avec l'extension .sln) et je souhaite écrire un script de traitement par lots simple qui générera automatiquement toutes les solutions répertoriées dans le fichier de traitement par lots.

Je peux créer manuellement une solution en démarrant le Visual Studio Command Prompt (qui est simplement une instance de ligne de commande avec la commande suivante exécutée

"%comspec%" /k "C:\Program Files\Microsoft Visual Studio 10.0\VC\vcvarsall.bat" x86

Après quoi, je construis le projet en appelant:

devenv "path\to\solutionFile\projectSolution1.sln" /build Debug

Cela construira le projet (en supposant que le projet ne comporte pas d’erreurs) et je le rince et le répète pour chaque projet que je veux construire.

Cependant quand j'ai les éléments suivants dans un fichier de commandes appelé build.bat:

"%comspec%" /k "C:\Program Files\Microsoft Visual Studio 10.0\VC\vcvarsall.bat" x86  
echo "Starting Build for all Projects with proposed changes" 
echo . 
devenv "path\to\solutionFile\projectSolution2.sln" /build Debug
devenv "another\path\to\solutionFile\projectSolution3.sln" /build Debug
devenv "yet\another\path\to\solutionFile\projectSolution4.sln" /build Debug
echo "All builds completed."
pause

Le script de commandes n'exécute que la première ligne et attend jusqu'à ce que je tape exit avant d'exécuter les autres. D'après ce que j'ai compris de la recherche que j'ai effectuée sur les fichiers de commandes et de toutes les questions de StackOverflow, cmd appelle en réalité une autre instance d'elle-même qui exécute vcvarsall.bat pour configurer l'environnement de construction.

Cela ne fonctionnera pas car taper exit tue cette instance avec devenv configuré et les commandes suivantes ne peuvent pas s'exécuter car devenv n'est pas une commande reconnue (car le chemin exporté n'existera plus)

En bref , comment cela peut-il être réalisé (en transmettant le reste des commandes à l'instance cmd avec devenv défini) dans un seul fichier de commandes? Je comprends que ce n’est pas un moyen robuste (et il existe de nombreux outils pour le faire) d’appeler des générations, mais j’espère avoir un seul script pour automatiser le travail manuel d’appel individuel de ces projets.

6
matrixanomaly

Comme l'a noté Jimmy, la solution trouvée, il faut supprimer la variable d'environnement %comspec% car il s'agit d'un raccourci vers CMD.exe. 

Cependant, la suppression de "%comspec" /k entraîne l'ouverture d'une instance CMD, puis sa fermeture au bout d'une seconde. J'ai également précédemment essayé la fonction call qui créait une instance CMD distincte lorsqu'elle était utilisée avec %comspec%

La solution consiste à ajouter call devant la première ligne et supprimer %comspec

Voici le fichier batch final qui a fonctionné comme prévu.

@echo OFF 
call "C:\Program Files\Microsoft Visual Studio 10.0\VC\vcvarsall.bat" x86
echo "Starting Build for all Projects with proposed changes"
echo .  
devenv "path\to\solutionFile\projectSolution2.sln" /build Debug 
devenv "another\path\to\solutionFile\projectSolution3.sln" /build Debug 
devenv "yet\another\path\to\solutionFile\projectSolution4.sln" /build Debug 
echo . 
echo "All builds completed." 
pause

Notez que @echo OFF indique au script de traitement par lots de ne pas renvoyer les commandes (telles que la commande call) dans le terminal (les erreurs et les avertissements seront toujours affichés).

12
matrixanomaly

Si cela est déjà dans un script batch, alors cette ligne:

"%comspec%" /k "C:\Program Files\Microsoft Visual Studio 10.0\VC\vcvarsall.bat" x86  

Devrait probablement juste être "C:\Program Files\Microsoft Visual Studio 10.0\VC\vcvarsall.bat" x86

Pourquoi? %comspec% est simplement un raccourci de variable d’environnement vers cmd.exe. Par conséquent, comme vous avez pu le constater, il lance une nouvelle instance de cmd avec l’option/k spécifiée (qui, si vous exécutez cmd /? indique Carries out the command specified by string but remains). Vous ne vous souciez pas de rester, vous ne voulez même pas un nouveau cmd.exe lorsque vous exécutez déjà votre fichier de commandes.

2
Jimmy