AJ Venturella
AJ Venturella

Reputation: 4912

Can a task ItemGroup glob files?

I have an ItemGroup declared as follows:

<ItemGroup>
    <MyCustomProjectType Include="..\path_to_my_project">
        <Name>MyProjectName</Name>
    </MyCustomProjectType>
</ItemGroup>

This is a custom project type that I want to perform some specific manipulations on.

Later I have a Target (example only but it communicates what I am after):

<Target Name="MyTarget">
    <ItemGroup>
        <CustomProjectReferenceFiles
            KeepMetadata="Name"
            Include="@(MyCustomProjectType->'%(Identity)\%(Name)\**\*')"
            Exclude="**\*.x;**\*.y"
        />
    </ItemGroup>
    <Message Text="@(CustomProjectReferenceFiles)" />
</Target>

So I have a Target based ItemGroup where I am attempting, using a transform, to create a new Include. This does run, but it appears the Include is literally set to:

..\path_to_my_project\MyProjectName\**\*

AKA that glob/wildcards are not expanded.

I'm pretty new to MSBuild so maybe I am missing something in my search of the documentation. One solution I thought of here would be just just create a new Custom Task that handles pulling out the files I need and setting that Output on an intermediate Target.

I also found this SO question: https://stackoverflow.com/a/3398872/1060314

Which brings up the point about CreateItem being deprecated which leaves me with not knowing what the alternatives are.

Upvotes: 1

Views: 760

Answers (1)

Martin Ullrich
Martin Ullrich

Reputation: 100601

The easiest way is to use an intermediate property so that the actual text is used and not the escaped transformed items:

<PropertyGroup>
  <_CustomProjectReferenceFileIncludes>@(MyCustomProjectType->'%(Identity)\%(Name)\**\*')</_CustomProjectReferenceFileIncludes>
</PropertyGroup>
<ItemGroup>
    <CustomProjectReferenceFiles
        KeepMetadata="Name"
        Include="$(_CustomProjectReferenceFileIncludes)"
        Exclude="**\*.x;**\*.y"
    />
</ItemGroup>

Upvotes: 1

Related Questions