spécifier le fichier projet d'une solution à l'aide de msbuild

116

Je veux la ligne de commande pour créer un projet particulier d'une solution à l'aide de msbuild comme nous le faisons avec devenv.com.Dans devenv.com, nous pouvons spécifier un projet de solution en utilisant la ligne de commande suivante

devenv.com /Build Release|x86 test.sln /project "testproject"

En utilisant la ligne de commande ci-dessus, je peux créer le testproject dans le test.sln en utilisant devenv.com. Quelle est la ligne de commande pour msbuild pour la même solution.

Merci

tjdoubts
la source
Une raison pour laquelle vous ne passez pas simplement le projet de test lui-même à msbuild?
Mark Smith
2
Puisque je ne peux plus modifier mon commentaire. Ce que je veux dire, c'est référencer directement le projet plutôt que la solution. "msbuild testproject / p: Configuration = Release / p: Platform = x86"
Mark Smith
temps différent je dois construire différents projets. en utilisant devenv.com c'est facile en spécifiant le projet de cette solution
tjdoubts
Si c'est le seul problème que vous rencontrez, vous devriez pouvoir utiliser msbuild pour créer les projets nécessaires au bon moment. Vous avez déjà différentes commandes que vous exécutez à différents moments sur la solution, alors pourquoi ne pas simplement référencer les projets au bon moment avec différentes commandes msbuild? Si vos projets sont correctement configurés, ils doivent trouver toutes leurs références sans utiliser le fichier sln.
Mark Smith

Réponses:

202
msbuild test.sln /t:project /p:Configuration="Release" /p:Platform="x86" /p:BuildProjectReferences=false

Notez que ce qui est affecté /test le nom du projet dans la solution, il peut être différent du nom du fichier projet.

En outre, comme indiqué dans Comment: créer des cibles spécifiques dans des solutions à l'aide de MSBuild.exe :

Si le nom du projet contient l' un des personnages %, $, @, ;, ., (, ), ou ', pour les remplacer par un _au nom de la cible spécifiée.

Vous pouvez également créer plusieurs projets à la fois:

msbuild test.sln /t:project;project2 /p:Configuration="Release" /p:Platform="x86" /p:BuildProjectReferences=false

Pour reconstruire ou nettoyer, changez /t:projecten /t:project:cleanou/t:project:rebuild

Easton L.
la source
99
Une remarque importante: si votre projet a un "." dans le nom, vous devrez le remplacer par un '_' lorsque vous le spécifiez avec / t
Watusimoto
4
@easton Pour la construction de plusieurs projets, la syntaxe était pour mon msbuild de répéter le /tparamètre pour chaque projet à construire:msbuild test.sln /t:project /t:project2
Philippe le
46
De plus, si vous utilisez un dossier de solution, vous devez préfixer le nom du projet avec le nom du dossier et une barre oblique. Comme @Watusimoto mentionné ci-dessus, si vous avez des points (.) Dans le nom, vous devez les remplacer par des traits de soulignement (_). J'ai fini avec quelque chose comme ceci: /t:SlnFolder\My_Project_name.
Travis Parks
28
@TravisParks: Il peut également être intéressant de mentionner que «dossier de solution» ne fait pas référence à un dossier de système de fichiers mais plutôt à un dossier dans la vue Explorateur de solutions.
joshbodily
4
J'ai également dû remplacer '(' et ')' par '_' dans le nom du dossier (projets générés par GYP). Je suppose que tous les caractères spéciaux sont remplacés par un trait de soulignement.
Maxime Viargues
15

MSBuild fonctionne réellement grâce à l'utilisation de projets et non à la solution. La solution est uniquement utilisée pour l'analyser dans un fichier de projet temporaire dans MSBuild en interne. Vous devriez pouvoir simplement créer le projet qui vous intéresse directement via MSBuild en exécutant la commande suivante.

"msbuild testproject /p:Configuration=Release /p:Platform=x86"

Il y a un problème majeur que je sais que vous pourriez rencontrer en utilisant le projet directement au lieu de la solution: si vous utilisez la solution pour exprimer les dépendances entre les projets, au lieu d'ajouter les références au projet et de laisser le système de construction déterminer automatiquement les dépendances .

Si vous appliquez un ordre de construction à l'aide du fichier sln, je vous recommande de travailler ces dépendances directement dans les fichiers proj et de les supprimer du sln. Cela vous permettra d'appeler directement n'importe quel fichier proj de MSBuild et les projets seront tous construits indépendamment sans aucun travail supplémentaire. Vous devez vraiment traiter le fichier sln comme un groupe de projets pour faciliter le travail dans Visual Studio et non comme une entrée de génération.

Mark Smith
la source
4
Veuillez indiquer comment l'ordre de construction peut être appliqué à partir des fichiers proj. Merci.
ProgramCpp
4
Voici un autre problème lié à l'utilisation directe du nom du projet. Par exemple, vous avez 5 projets dans votre solution. Certains projets ont une configuration DebugPro et d'autres ne l'ont pas. Si vous créez un projet avec la configuration que tous les projets ont tout est fichier, mais seul le fichier de solution sait quelle configuration de projet utiliser pour chaque projet si vous avez sélectionné la configuration de solution DebugPro.
Alex
@ProgramCpp Lorsque vous ajoutez des références d'un projet à un autre, il comprend automatiquement que le projet référencé doit d'abord être construit.
jpaugh
Un autre inconvénient de cette approche est que le chemin relatif dans le projet est résolu par rapport au fichier de solution. Une fois que vous avez construit le projet, le chemin relatif directement changera. La sortie peut être ailleurs et les tests unitaires peuvent rechercher de mauvais répertoires.
Tomas Kubes
Des problèmes peuvent également apparaître si vous utilisez des variables de solution dans la configuration du projet, comme $ (SolutionDir)
Alex Che
8

Publier comme information aux futurs chercheurs

Ajoutez ce qui suit au script de construction et exécutez-le une fois. Cela générera les cibles exactes et d'autres informations que msbuild utilisera réellement.

Ex: Si vous avez .dans le nom du projet ou des dossiers que msbuild attendra _à la place du ..

set MSBuildEmitSolution=1

Après avoir obtenu les informations, mettez à jour le script de construction avec les détails requis.

fraîcheur
la source
6
"Si vous avez". " dans le nom ou les dossiers du projet, msbuild attendra «_» à la place du «.». «
dhcgn
2

Pour ce faire, vous devez savoir quel est le nom cible du projet , pas nécessairement le nom du projet.

Une façon de le savoir consiste à utiliser MSBuild contre votre SLN avec les paramètres voulus après avoir défini une variable d'environnement spéciale appelée MSBuildEmitSolutionà la valeur de 1.

set MSBuildEmitSolution=1
msbuild my_stuff.sln /t:rebuild /p:Configuration=Release /p:Platform=x64

J'ai récemment dû le faire en raison d'un nom très spécifique pour une cible dans des répertoires imbriqués. Donc, à partir de mon fichier généré, my_stuff.sln.metaprojj'ai trouvé cette ligne:

<Target Name="Utils\Firewall\FirewallUtils:Rebuild">

Cela signifie que la ligne de commande à utiliser finit par être,

msbuild my_stuff.sln /t:Utils\Firewall\FirewallUtils:Rebuild /p:Configuration=Release /p:Platform=x64
kayleeFrye_onDeck
la source
2
C'était ce dont j'avais besoin. Astuce si vous ne voulez pas exécuter ceci: votre cible est la structure de dossier du chemin actuel vers votre fichier de projet, moins l'extension de fichier de projet ( .csprojdans mon cas). Je <3 SO!
Aucun remboursement Aucun retour
1

Juste pour ajouter des informations supplémentaires, l'exécution de msbuild dans le dossier du projet générera par défaut le fichier de projet puisque c'est le seul qui s'y trouve.

>msbuild

Il existe de nombreuses variantes d'utilisation de msbuild de cette façon. Vous pouvez spécifier le fichier proj directement.

>msbuild helloworld.csproj -t:Build.

Consultez la documentation de msbuild pour connaître l'utilisation, les exigences du fichier projet, ainsi que les avantages de la création du projet au lieu de la solution.

Documentation MS MSBuild

Il y a des avantages à construire de cette manière, comme mentionné par Mark-Smith ci-dessus.

CJ
la source