msbuild可以解决由转换产生的通配符表达式吗?

时间:2011-06-30 15:45:14

标签: msbuild

我希望下面的代码能够为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

因此看起来通配符表达式在转换结果时不会被展开。我在这里错过了什么?

1 个答案:

答案 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完成后所期望的结果。