考虑MSBuild项目中的项目类型FooItem
。
在任务中,我们可以引用项目及其元数据,例如:
%(FooItem.BarMetadata)
或
@(FooItem->'Metadata("BarMetadata")')
或
@(FooItem->'%(BarMetadata)')
这三种方法有什么不同,看起来和我一模一样?显然,变换语法(->
)通常更强大,但我已经明确地给出了一个简单的例子,相当于使用%
运算符,我可以告诉你。
此外,这里的任务批处理是否有任何影响(假设这些表达式在一个任务项内)?一般来说,我想知道是否有任何方法可以阻止元数据进行任务批处理,同时仍然在引用任务中的某些元数据。
答案 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