MSBuild是否具有项元数据的细微差别?

MSBuild是否具有项元数据的细微差别?,msbuild,msbuild-task,Msbuild,Msbuild Task,考虑MSBuild项目中的项类型FooItem 在任务中,我们可以引用项及其元数据,例如: %(FooItem.BarMetadata) 或 或 这三种方法在我看来是相同的,它们之间有什么区别吗?显然,转换语法(->)一般来说更强大,但我已经明确给出了一个简单的示例,相当于使用%运算符 此外,这里是否对任务批处理有任何影响(假定这些表达式在任务项中)?一般来说,我想知道是否有任何方法可以防止在任务中引用某些元数据的同时通过元数据对任务进行批处理。没有完全相同的方法。转换语法将输入附加到分号分隔

考虑MSBuild项目中的项类型
FooItem

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

%(FooItem.BarMetadata)

这三种方法在我看来是相同的,它们之间有什么区别吗?显然,转换语法(
->
)一般来说更强大,但我已经明确给出了一个简单的示例,相当于使用
%
运算符

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

没有完全相同的方法。转换语法将输入附加到分号分隔的数组。
%
符号将输入添加到

考虑以下目标:

<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>

Word文档
Excel文档
PowerPoint演示文稿
如输出所示,这些符号产生不同的输出:

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 测试元数据: 转换:C:\MSBuild\File1.doc是Word文档;C:\MSBuild\File2.xls是Excel文档;C:\\MSBuild\File3.pps是PowerPoint演示文稿 直接:C:\MSBuild\File1.doc是Word文档 直接:C:\MSBuild\File2.xls是Excel文档
Direct:C:\MSBuild\File3.pps是PowerPoint演示文稿,因此基本上您要说的是转换语法(
->
)不执行任何任务批处理,而
%
执行任何任务批处理。。。看起来不错,对吧?不。你可以用这两种方法进行配料,因为它们之间的量很少。当我需要简单的非格式化字符串数组时,我会使用
->
,但很明显,第一种情况是批处理,而不是第二种情况。解释一下。两种形式的转换语法(->)都避免了批处理。它将列表中的每个项目转换为一个“临时的、无名的列表”,该列表的行为与任何其他列表一样——就像您直接使用@(foo)一样。裸元数据语法(no->)导致批处理;一次只需要一件物品。丹(msbuild)
<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