4

私は MSBuild に基づいてビルド システムを作成しており、3 つの変数をバッチ処理して 1 つの msbuild ファイルを本質的に 88 回実行する必要があるプロジェクトの最後まで進んでいます。

構成 = デバッグ; ベータ; リリース; 評価
プラットフォーム = x86; x64
言語 = CN; CS; DE; えん; ES; フランス; それ; 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 に 3 つの文字を追加するのと同じくらい簡単です。

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

2 に答える 2

7

何年も前に回答を投稿してくれたAnders Ljusbergに感謝します。解決策は、CreateItem タスクを使用して個々の ItemGroup を 1 つの ItemGroup に結合することです。空のメタデータが漏れるのを防ぐために、各項目の外積を新しい ItemGroup (この場合は _Config_X_Language と _Config_X_Language_X_Platform) に一度に 1 つずつ実行する必要があります (_Config_X_Language を再利用しようとすると、空の Platform を持つ項目が取得されます。 n $(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" />
于 2010-10-08T20:00:03.537 に答える