2010-10-08 3 views
4

Я пишу систему сборки, основанную на MSBuild, и нахожусь в конце проекта, где мне нужно по существу запустить файл один MsBuild 88 раз от дозировании в течение трех переменных:MSBuild Дозирование на трех независимых переменных

Конфигурация = Отладка; Бета; Выпуск; Оценка
Платформа = x86; x64
Язык = CN; CS; DE; РУ; ES; FR; ЭТО; В JP; KO; PL; TW

Я хочу построить:
"Debug x86 CN", "Debug x86 CS", ... "Debug x86 TW"
"Debug x64 CN", ...

я могу, конечно, определите 88 из них:

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

А затем партия на основе метаданных. Но какое сопротивление! Могу ли я создать 88 перестановок в коде, так что добавление языка так же легко, как добавление трех символов к 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> 

ответ

7

Благодаря Anders Ljusberg для размещения ответа на эти годы назад. Решение состоит в том, чтобы использовать задачу CreateItem, чтобы объединить отдельные элементы в одну группу ItemGroup. Кросс-продукт каждого элемента необходимо делать по одному в новую ItemGroup (в данном случае _Config_X_Language и _Config_X_Language_X_Platform), чтобы предотвратить утечку пустых метаданных (если вы попытаетесь повторно использовать _Config_X_Language, вы получите элементы с пустой платформой, п дополнение к платформам в $ (Platform).

<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

О, ты очень рад/Андерс ;-) – CodingInsomnia

0

это хорошая идея, чтобы объединить отдельные ItemGroups в одну ItemGroup. Однако при использовании этого метода MSBuild строит проекты, игнорируя атрибут BuildInParallel (все проекты здания последовательно) Для этого вам нужно что-то добавить:

<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" /> 
Смежные вопросы