MSBuild与项目元数据的微妙之处?

时间:2012-03-27 16:53:52

标签: msbuild msbuild-task

考虑MSBuild项目中的项目类型FooItem

在任务中,我们可以引用项目及其元数据,例如:

%(FooItem.BarMetadata)

@(FooItem->'Metadata("BarMetadata")')

@(FooItem->'%(BarMetadata)')

这三种方法有什么不同,看起来和我一模一样?显然,变换语法(->)通常更强大,但我已经明确地给出了一个简单的例子,相当于使用%运算符,我可以告诉你。

此外,这里的任务批处理是否有任何影响(假设这些表达式在一个任务项内)?一般来说,我想知道是否有任何方法可以阻止元数据进行任务批处理,同时仍然在引用任务中的某些元数据。

1 个答案:

答案 0 :(得分:3)

相同。转换语法将输入附加到以分号分隔的Items数组。 %表示法会将输入添加到ItemGroup Element

考虑以下目标:

<Target Name="TestMetadata">

  <ItemGroup>
    <Files Include="File1.doc">
      <Description>Word Document</Description>
    </Files>
    <Files Include="File2.xls">
      <Description>Excel Document</Description>
    </Files>
    <Files Include="File3.pps">
      <Description>PowerPoint Presentation</Description>
    </Files>
  </ItemGroup>

  <Message Text="Transform: @(Files->'%(FullPath) is %(Description)')" />
  <Message Text="Direct: %(Files.FullPath) is %(Files.Description)" />

</Target>

如输出所示,这些符号会产生不同的输出:

TestMetadata:   
 Transform: C:\MSBuild\File1.doc is Word Document;C:\MSBuild\File2.xls is Excel Document;C:\\MSBuild\File3.pps is PowerPoint Presentation
Direct: C:\MSBuild\File1.doc is Word Document   
Direct: C:\MSBuild\File2.xls is Excel Document   
Direct: C:\MSBuild\File3.pps is PowerPoint Presentation