VC PlusPlus:MSBuild アイテムグループ変数

提供:yonewiki

VC PlusPlus:MSBuildに戻る。

概要

 アイテムグループ変数は@(ItemGroup)のような形式でアットマークを使って表記する変数です。


アイテムグループの基礎

 タグごとにアイテムグループという概念が存在します。以下のようにTextというアイテムが定義されていたとします。そうするとタグ名Textというアイテムグループが存在することになり、@(Text)で、その内容が出力できます。

<Project ...>
  <ItemGroup>
    <Text Include="doc\a.en.txt" />
    <Text Include="doc\a.ja.txt" />
    <Text Include="doc\a_hpnonstop.en.txt" />
    <Text Include="doc\a_hpnonstop.ja.txt" />
    <Text Include="doc\a.en.txt" />
    <Text Include="doc\a.ja.txt" />
  </ItemGroup>
  <Target Name="MessageText" AfterTargets="Build">
    <Message Text="@ (Text) =@(Text)" />
  </Target>
</Project>

出力結果

@ (Text) = doc\a.en.txt;doc\a.ja.txt;doc\a_hpnonstop.en.txt;doc\a_hpnonstop.ja.txt;doc\a.en.txt;doc\a.ja.txt


 このようにバッチのように複数行にはなりませんが、セミコロンでひとまとめにされたものとして、表示できます。@(text)は@(text->'%(Identity)')のように呼び出したの同じ出力になっています。


アイテムグループの中の要素

 アイテムグループの中にバッチがあったときは、@(text->'%(Identity)')のように指定できると書きました。ここに固定の文字列を追加することもできます。例えば


<Project ...>
  <ItemGroup>
    <Text Include="doc\a.en.txt" />
    <Text Include="doc\a.ja.txt" />
  </ItemGroup>
  <Target Name="MessageText" AfterTargets="Build">
    <Message Text="@ (Text) = {@(Text->'Include = %(Identity)')}" />
  </Target>
</Project>

出力結果

@ (Text) = {Include = doc\a.en.txt;Include = doc\a.ja.txt}


 と、このように固定の文字を入れ込むと、バッチの含まれる個数分、繰り返し固定の文字が表示されます。

 

アイテムグループの中の処理

 アイテムグループの中で特定の処理を記述することもできます。つまりアイテムグループの中に記述できる特別なキーワードが存在するということです。かなり多くの処理ができるようになっています。項目関数と呼んでいます。こんなものがあります。


<Project ...>
  <ItemGroup>
    <Text Include="doc\a.en.txt">
      <LinkCompiled>True</LinkCompiled>
    </Text>
    <Text Include="doc\a.ja.txt">
      <LinkCompiled>False</LinkCompiled>
    </Text>
  </ItemGroup>
  <Target Name="MessageText" AfterTargets="Build">
    <Message Text="@ (Text) = {@(Text->WithMetadataValue('LinkCompiled', 'true'))}" />
  </Target>
</Project>

出力結果

@ (Text) = {doc\a.en.txt}


 WithMetadataValueという項目関数を使うと第1引数で指定したタグ値と第2引数で指定した保持値(Include値)が指定したものと一致したものに絞るということができます。この記事ではアイテムグループ内で項目関数が使えるという紹介に留めます。項目関数については専用の記事で説明したいと思います。

 

VC PlusPlus:MSBuildに戻る。