Hassan
Hassan

Reputation: 2643

Evaluate item multiple times

Not sure if that the right title for the question, but what I'm trying to do is this:

<ItemGroup>
    <item1 Include="a;b;c;"/>
    <item2 Include="x;y;z;"/>
    <itemNames Include="item1;item2"/>
</ItemGroup>

<Target Name="DefaultName">
    <Message Text="%(%(itemNames.Identity))"/>
</Target>

I'm expecting output to be:

a;b;c;
x;y;z;

Instead, the output is:

%(item1)
%(item2)

So my guess is that the Text property is parsed only once and the resulting string is not. Any workarounds arround this?

Upvotes: 1

Views: 62

Answers (1)

Brian Kretzler
Brian Kretzler

Reputation: 9938

The following will produce the output you are looking for:

    <ItemGroup> 
       <item1 Include="a;b;c;"/> 
       <item2 Include="x;y;z;"/> 
       <itemNames Include="item1;item2"/> 
    </ItemGroup> 

    <Target Name="DefaultName"
       Outputs="%(itemNames.Identity)">
       <PropertyGroup>
          <ThisItem>%(itemNames.Identity)</ThisItem>
       </PropertyGroup>
       <ItemGroup>
          <ThisItem Include="@($(ThisItem))" />
       </ItemGroup>
       <Message Text="@(ThisItem)" />
    </Target> 

...shows the following output...

DefaultName:
  a;b;c
DefaultName:
  x;y;z

Excerpted from MSBuild Trickery tricks #68 and 69

Upvotes: 1

Related Questions