MSBuild: spécifier une cible à partir de la ligne de commande
J'ai une tâche MSBuild pour construire un projet spécifique dans un fichier solution. Il ressemble à quelque chose comme ceci:
<Target Name="Baz">
<MSBuild Projects="Foo.sln" Targets="bar:$(BuildCmd)" />
</Target>
à Partir de la ligne de commande, je peux mettre mon BuildCmd
Rebuild
ou Clean
et il fonctionne comme prévu:
msbuild /cible:Baz /propriété:BuildCmd=Reconstruire MyMsbuildFile.XML msbuild /cible:Baz /propriété:BuildCmd=Clean MyMsbuildFile.xml
mais quel mot dois-je utiliser pour définir BuildCmd
dans le but de construire? J'ai essayé Build
et Compile
et le laisser vide ou non défini, mais j'ai toujours une erreur.
msbuild /cible:Baz /propriété:BuildCmd=Construire MyMsbuildFile.XML Foo.sln: erreur MSB4057:la cible "barre: construire" n'existe pas dans le projet.
msbuild /cible:Baz /propriété:BuildCmd=Compiler MyMsbuildFile.XML Foo.sln: erreur MSB4057:la cible "barre: compiler" n'existe pas dans le projet.
msbuild / cible: Baz MyMsbuildFile.XML Foo.sln: erreur MSB4057: la "barre" cible n'existe pas dans le projet.
5 réponses
j'ai compris que vous voulez construire une cible avec une commande spécifique: Construire, Nettoyer, etc.
C'est comme ça que je le ferais.
Créer une propriété pour recevoir votre commande de construction, lorsqu'il n'est pas spécifié les valeurs par défaut pour Construire
<PropertyGroup>
<BuildCmd Condition=" '$(BuildCmd)' == ''">Build</BuildCmd>
</PropertyGroup>
après, créez la cible qui démarrera MSBuild avec la cible spécifiée dans le paramètre:
<Target Name="Stackoverflow">
<MsBuild Projects="Foo.sln" Targets="$(BuildCmd)" />
</Target>
puis appelez votre fichier MSBuild avec la cible et le paramètre BuildCmd comme donc:
msbuild msbuild.xml /t:Stackoverflow /p:BuildCmd=Clean
assurez-vous simplement que la cible existe dans la solution ou le dossier de projet.
:http://msdn.microsoft.com/en-us/library/ms164311.aspx
/ cible: cibles
établit ces objectifs dans le cadre de ce projet. Utilisez un point-virgule ou une virgule pour séparer plusieurs cibles, ou spécifiez chaque cible séparément. /t est également acceptable. Exemple: / cible: ressources; compiler
la clé est de conditionnaliser la propriété BuildCmd.
<Target Name="Baz">
<PropertyGroup>
<BuildCmd Condition="'$(BuildCmd)' != ''">:$(BuildCmd)</BuildCmd>
</PropertyGroup>
<MSBuild Projects="Foo.sln" Targets="bar$(BuildCmd)" />
</Target>
de cette façon, si Clean ou Rebuild sont définis, le colon est ajouté. Si rien n'est ajouté, BuildCmd sera juste vide, en défaut à la cible de construction.
Remarque: - Le groupe doit résider dans la cible, ou il sera remplacé lorsque vous le spécifier sur la ligne de commande.
en utilisant le modèle de CheGueVerra, j'ai trouvé la solution suivante:
<PropertyGroup>
<ProjBuildCmd Condition="'$(BuildCmd)' != 'Build'">:$(BuildCmd)</ProjBuildCmd>
<SolnBuildCmd Condition="'$(BuildCmd)' != 'Build'">$(BuildCmd)</SolnBuildCmd>
</PropertyGroup>
Et puis au lieu d'utiliser $(BuildCmd)
directement, j'utilise $(ProjBuildCmd)
ou $(SolnBuildCmd)
comme ceci:
<!-- Build the 'bar' project only -->
<Target Name="Baz">
<MSBuild Projects="Foo.sln" Targets="bar$(ProjBuildCmd)" />
</Target>
<!-- Build the whole solution -->
<Target Name="Baz2">
<MSBuild Projects="Foo.sln" Targets="$(SolnBuildCmd)" />
</Target>
éditez le fichier sln vous - même et découvrez que-MSBuild est une syntaxe très facile, cherchez simplement les cibles.