web-dev-qa-db-ja.com

既存のアイテムグループをフィルタリングして、特定の条件に一致するファイルのみが含まれるようにします

ファイル拡張子やアイテムのメタデータなどの特定の条件に基づいて、既存の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: ''
24
Kaleb Pederson
<ItemGroup>
  <Filtered Include="@(None)" Condition="'%(Extension)' == '.ext'" />
</ItemGroup>
38

高度なフィルタリングについては、 MSBuild Community TasksRegexMatchを使用することをお勧めします。

この例では、バージョン番号をフィルタリングします

    <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" />
1
LuckyLikey