ファイル拡張子やアイテムのメタデータなどの特定の条件に基づいて、既存のItemGroupをどのようにフィルタリングしますか?
この例では、ファイル拡張子を使用します。ターゲットが特定の拡張子のすべてのファイルを操作できるように、VSによって定義された「なし」ItemGroupをフィルタリングしようとしています。
たとえば、次のように定義できます。
<ItemGroup>
<None Include="..\file1.ext" />
<None Include="..\file2.ext" />
<None Include="..\file.ext2" />
<None Include="..\file.ext3" />
<None Include="..\file.ext4" />
</ItemGroup>
上記の「なし」ItemGroupをフィルタリングして、ext
拡張子のみが含まれるようにします。プロジェクトごとに異なるため、除外するすべての拡張機能を指定したくないnotことに注意してください。ターゲットを再利用可能にしようとしています。変形。
ターゲット内にCondition
を追加してみました。
<Target Name="Test">
<ItemGroup>
<Filtered
Include="@(None)"
Condition="'%(Extension)' == 'ext'"
/>
</ItemGroup>
<Message Text="None: '%(None.Identity)'"/>
<Message Text="Filtered: '%(Filtered.Identity)'"/>
</Target>
しかし悲しいことに、それは機能しません。出力として次のようになります。
Test:
None: '..\file1.ext'
None: '..\file2.ext'
None: '..\file.ext2'
None: '..\file.ext3'
None: '..\file.ext4'
Filtered: ''
<ItemGroup>
<Filtered Include="@(None)" Condition="'%(Extension)' == '.ext'" />
</ItemGroup>
高度なフィルタリングについては、 MSBuild Community Tasks のRegexMatch
を使用することをお勧めします。
この例では、バージョン番号をフィルタリングします
<RegexMatch Input="@(Items)" Expression="\d+\.\d+\.\d+.\d+">
<Output ItemName ="ItemsContainingVersion" TaskParameter="Output" />
</RegexMatch>
Nugetを介してMSBuildコミュニティタスクをインストールします:PM> Install-Package MSBuildTasksまたはダウンロード ここ
次に、MSBuildスクリプトにインポートします。
<PropertyGroup>
<MSBuildCommunityTasksPath>..\.build\</MSBuildCommunityTasksPath>
</PropertyGroup>
<Import Project="$(MSBuildCommunityTasksPath)MsBuild.Community.Tasks.Targets" />