「VC PlusPlus:MSBuild アイテムグループ変数」の版間の差分
(同じ利用者による、間の1版が非表示) | |||
27行目: | 27行目: | ||
@ (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) = 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 | ||
</syntaxhighlight> | </syntaxhighlight> | ||
このようにバッチのように複数行にはなりませんが、セミコロンでひとまとめにされたものとして、表示できます。@(text)は@(text->'%(Identity)')のように呼び出したの同じ出力になっています。 | このようにバッチのように複数行にはなりませんが、セミコロンでひとまとめにされたものとして、表示できます。@(text)は@(text->'%(Identity)')のように呼び出したの同じ出力になっています。 | ||
=== '''アイテムグループの中の要素''' === | |||
アイテムグループの中にバッチがあったときは、@(text->'%(Identity)')のように指定できると書きました。ここに固定の文字列を追加することもできます。例えば | |||
<syntaxhighlight lang="xml"> | |||
<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> | |||
</syntaxhighlight> | |||
出力結果 | |||
<syntaxhighlight lang="xml"> | |||
@ (Text) = {Include = doc\a.en.txt;Include = doc\a.ja.txt} | |||
</syntaxhighlight> | |||
と、このように固定の文字を入れ込むと、バッチの含まれる個数分、繰り返し固定の文字が表示されます。 | |||
=== '''アイテムグループの中の処理''' === | |||
アイテムグループの中で特定の処理を記述することもできます。つまりアイテムグループの中に記述できる特別なキーワードが存在するということです。かなり多くの処理ができるようになっています。項目関数と呼んでいます。こんなものがあります。 | |||
<syntaxhighlight lang="xml"> | |||
<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> | |||
</syntaxhighlight> | |||
出力結果 | |||
<syntaxhighlight lang="xml"> | |||
@ (Text) = {doc\a.en.txt} | |||
</syntaxhighlight> | |||
WithMetadataValueという項目関数を使うと第1引数で指定したタグ値と第2引数で指定した保持値(Include値)が指定したものと一致したものに絞るということができます。この記事ではアイテムグループ内で項目関数が使えるという紹介に留めます。[[VC PlusPlus:MSBuild#MSBuildでの項目関数|項目関数]]については専用の記事で説明したいと思います。 | |||
[[VC PlusPlus:MSBuild#関連記事|VC PlusPlus:MSBuild]]に戻る。 | [[VC PlusPlus:MSBuild#関連記事|VC PlusPlus:MSBuild]]に戻る。 |
2024年2月18日 (日) 03:24時点における最新版
概要
アイテムグループ変数は@(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値)が指定したものと一致したものに絞るということができます。この記事ではアイテムグループ内で項目関数が使えるという紹介に留めます。項目関数については専用の記事で説明したいと思います。