我希望下面的代码能够为List和List2生成相同的项目(我在搜索路径中有一个cpp1项目)。
<ItemGroup>
<src Include="cpp1"/>
<List Include="@(src -> '..\..\..\projects\**\%(identity).vcxproj')" />
<List2 Include="..\..\..\projects\**\cpp1.vcxproj" />
</ItemGroup>
但我得到的是:
List: ..\..\..\projects\**\cpp1.vcxproj
List2: ..\..\..\projects\common\cpp1\cpp1.vcxproj
因此看起来通配符表达式在转换结果时不会被展开。我在这里错过了什么?
答案 0 :(得分:3)
您可以获得额外的转换,但是您需要添加一个额外的项目数组,并且需要一次添加一个具有依赖目标的每个潜在元素。您还需要通过属性
传递中间项规范<ItemGroup>
<src Include="cpp1"/>
<List1a Include="@(src -> '..\..\..\projects\**\%(Identity).vcxproj')" />
<List2 Include="..\..\..\projects\**\cpp1.vcxproj" />
</ItemGroup>
<Target Name="TransformWithWildcards"
Outputs="%(List1a.Identity)">
<PropertyGroup>
<_ThisList1a>@(List1a)</_ThisList1a>
</PropertyGroup>
<ItemGroup>
<List1b Include="$(_ThisList1a)" />
</ItemGroup>
</Target>
<Target Name="Transform"
DependsOnTargets="TransformWithWildcards">
<Message Text="1a. %(List1a.Identity)" />
<Message Text="1b. %(List1b.Identity)" />
<Message Text="2. %(List2.Identity)" />
</Target>
@(List1a)与原始@(List)相同,@(List1b)包含您在TransformWithWildcards完成后所期望的结果。