2010-10-08 5 views
4

J'ai écrit un système de construction basé sur MSBuild, et je suis à la fin du projet où je dois exécuter essentiellement un fichier msbuild 88 fois par batching sur trois variables:MSBuild Batching sur trois variables indépendantes

Configuration = débogage; Bêta; Libération; Evaluation
Plate-forme = x86; x64
Langue = CN; CS; DE; EN; ES; FR; IL; JP; KO; PL; TW

Je veux construire:
"Debug x86 CN", "Debug x86 CS", ... "Debug x86 TW"
"Debug x64 CN", ...

je peux, bien sûr, définissez 88 d'entre eux:

<ItemGroup> 
    <ToBuild Include="Debug_x86_CN"> 
    <Configuration>Debug</Configuration> 
    <Platform>x86</Platform> 
    <Language>EN</Language> 
    </ToBuild> 
<ItemGroup> 

Puis lot basé sur des métadonnées. Mais quel drag! Puis-je créer les 88 permutations dans le code, afin d'ajouter une langue est aussi facile que l'ajout de trois caractères à un ItemGroup:

<ItemGroup> 
    <AllConfigurations Include="Beta; Release; Evaluation;"/> 
    <AllPlatforms Include="x86; x64" /> 
    <AllLanguages Include="CN; CS; DE; EN; ES; FR; IT; JP; KO; PL; TW" /> 
</ItemGroup> 

Répondre

7

Merci à Anders Ljusberg pour l'affichage d'une réponse à cette année il y a. La solution consiste à utiliser la tâche CreateItem pour combiner les ItemGroups individuels dans un ItemGroup. Le produit croisé de chaque élément doit être fait un à la fois dans un nouveau ItemGroup (dans ce cas, _Config_X_Language et _Config_X_Language_X_Platform) pour empêcher les métadonnées vides de fuir (si vous essayez de réutiliser _Config_X_Language, vous obtiendrez des éléments avec une plate-forme vide, n plus des plates-formes en $ (plate-forme).

<ItemGroup> 
    <Configuration Include="Beta; Release; Evaluation;"/> 
    <Platform Include="x86; x64" /> 
    <Language Include="CN; CS; DE; EN; ES; FR; IT; JP; KO; PL; TW" /> 
</ItemGroup> 

<!-- Create an ItemGroup that is the cross product of Configuration and Language: --> 
<CreateItem Include="@(Configuration)" AdditionalMetadata="Language=%(Language.Identity);" > 
    <Output ItemName="_Config_X_Language" TaskParameter="Include"/> 
</CreateItem> 
<!-- Create another ItemGroup that is the cross product of _Configuration_X_Language and Platform: --> 
<CreateItem Include="@(_Config_X_Language)" AdditionalMetadata="Platform=%(Platform.Identity);" > 
    <Output ItemName="_Config_X_Language_X_Platform" TaskParameter="Include"/> 
</CreateItem> 

<!-- Task batch over each unique set of metadata on AllBuilds --> 
<MSBuild Projects="myproject.msbuild" 
      Properties="Configuration=%(_Config_X_Language_X_Platform.Identity); 
         Platform=%(_Config_X_Language_X_Platform.Platform); 
         Language=%(_Config_X_Language_X_Platform.Language);" 
      Targets="MyTarget" 
      BuildInParallel="true" /> 
+0

Oh, vous êtes les bienvenus/Anders ;-) – CodingInsomnia

0

Il est une bonne idée de combiner les ItemGroups individuels en un seul ItemGroup. Cependant, lors de l'utilisation de cette méthode MSBuild construit des projets en ignorant l'attribut BuildInParallel (tous bâtiment des projets toujours Vous avez donc besoin de quelque chose pour compléter le script:

<ItemGroup> 
    <Configuration Include="Beta; Release; Evaluation;"/> 
    <Platform Include="x86; x64" /> 
    <Language Include="CN; CS; DE; EN; ES; FR; IT; JP; KO; PL; TW" /> 
</ItemGroup> 

<!-- Create an ItemGroup that is the cross product of Configuration and Language: --> 
<CreateItem Include="@(Configuration)" AdditionalMetadata="Language=%(Language.Identity);" > 
    <Output ItemName="_Config_X_Language" TaskParameter="Include"/> 
</CreateItem> 
<!-- Create another ItemGroup that is the cross product of _Configuration_X_Language and Platform: --> 
<CreateItem Include="@(_Config_X_Language)" AdditionalMetadata="Platform=%(Platform.Identity);" > 
    <Output ItemName="_Config_X_Language_X_Platform" TaskParameter="Include"/> 
</CreateItem> 

<!--Creating groups for projects to build--> 
<!--In the attribute AdditionalMetadata sign '=' is changed to '%3D', and the sign ';'' changed to '%3B'--> 
<CreateItem Include="myproject.msbuild" AdditionalMetadata="Properties= 
                  Configuration%3D%(_Config_X_Language_X_Platform.Identity)%3B 
                  Platform%3D%(_Config_X_Language_X_Platform.Platform)%3B 
                  Language%3D%(_Config_X_Language_X_Platform.Language)" > 
    <Output ItemName="ProjectToBuild" TaskParameter="Include"/> 
</CreateItem> 

<!--Task batch build all projects parallel --> 
<MSBuild Projects="@(ProjectToBuild)" 
     Targets="MyTarget" 
     BuildInParallel="true" 
     StopOnFirstFailure="true" /> 
Questions connexes