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 BuildCmdRebuild 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.

23
demandé sur Peter Mortensen 2008-10-24 04:07:38

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.

21
répondu CheGueVerra 2016-05-16 17:18:32

: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

6
répondu Tim Stewart 2008-10-24 05:07:41

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.

2
répondu Matt Slagle 2012-07-27 13:44:44

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>
0
répondu 2008-10-24 21:04:31

éditez le fichier sln vous - même et découvrez que-MSBuild est une syntaxe très facile, cherchez simplement les cibles.

-7
répondu ripper234 2008-10-24 00:45:19