web-dev-qa-db-fra.com

MSBuild: Spécification d'une cible de la ligne de commande

J'ai une tâche Msbuild pour créer un projet spécifique dans un fichier de solution. Cela ressemble à quelque chose comme ça:

<Target Name="Baz">
  <MSBuild Projects="Foo.sln" Targets="bar:$(BuildCmd)" />
</Target>

De la ligne de commande, je peux définir mon BuildCmd sur Rebuild ou Clean et cela fonctionne comme prévu:

msbuild/Target: Baz/Propriété: BuildCMD = Recuilild MyMSBuildFile.xml Msbuild/Target: Baz/Propriété: BuildCMD = Clean MyMsBuildFile.xml

Mais quel mot dois-je utiliser pour définir BuildCmd pour simplement construire? J'ai essayé Build et Compile et juste le laisser vide ou indéfini, mais j'ai toujours une erreur.

msBuild/Target: Baz/Propriété: BuildCMD = Build MyMSBUILDFILE.XML FOO.SLN: Erreur MSB4057: La cible "Barre: Build" n'existe pas dans le projet.

msbuild/Target: Baz/Propriété: BuildCMD = Compiler MyMSBUILDFILE.XML FOO.SLN: Erreur MSB4057: La cible "Barre: Compiler" n'existe pas dans le projet.

msBuild/Target: Baz MyMSBUILDFILE.XML FOO.SLN: Erreur MSB4057: La cible "barre:" n'existe pas dans le projet.

24
Derek

J'ai compris que vous souhaitez construire une cible avec une commande spécifique: Construire, nettoyer, etc.

C'est comme ça que je le ferais.

Créez une propriété pour recevoir votre commande Build, lorsqu'il n'est pas spécifié par défaut de 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>

Appelez ensuite votre fichier MSBuild avec le paramètre cible et BuildCMD, comme vous le souhaitez:

msbuild msbuild.xml /t:Stackoverflow /p:BuildCmd=Clean

Assurez-vous simplement que la cible existe dans la solution ou le fichier de projet.

24
CheGueVerra

De: http://msdn.microsoft.com/en-us/library/ms164311.aspx

/ cible: cibles

Construit ces objectifs dans ce projet. Utilisez un point-virgule ou une virgule pour séparer plusieurs cibles ou spécifier chaque cible séparément./T est également acceptable. Par exemple:/cible: ressources; Compiler

6
Tim Stewart

La clé est conditionnalisée à 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 propre ou reconstruit est défini, le côlon est ajouté. Si rien n'est ajouté, BuildCMD sera simplement vide, défaut de la cible de construction.

Remarque - Le groupe de propriétés doit résider dans la cible ou sera remplacé lorsque vous le spécifiez sur la ligne de commande.

2
Matt Slagle

Utilisation du modèle de Chegueverra, j'ai proposé 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
Derek