从另一个ItemGroup添加自定义元数据到已定义的ItemGroup

6

我有以下内容:

<ItemGroup>
  <Files Include="C:\Versioning\**\file.version" />
<ItemGroup>

<ReadLinesFromFile File="%(Files.Identity)">
  <Output TaskParameter="Lines" ItemName="_Version"/>
</ReadLinesFromFile>

每个文件.version文件只包含一行,即一个形式为Major.Minor.Build.Revision的版本。

我希望能够通过添加元数据将_VersionFiles ItemGroup中的每个项目关联起来,以便我可以执行类似以下操作:

<Message Text="%(Files.Identity): %(Files.Version)" />

能否让MSBuild输出一个漂亮的文件版本关联列表呢?
1个回答

6
这可以通过使用目标批处理来将您的 Version 成员添加到元数据中来实现。这涉及将您的 ReadLinesFromFile 操作移动到自己的目标中,使用 @(Files) ItemGroup作为输入。
这会导致目标针对ItemGroup中的每个项目执行,使您能够从每个单独的文件中读取内容(即版本号),并随后更新该项以添加 Version 元数据:
<Project DefaultTargets="OutputFilesAndVersions" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
    <ItemGroup>
      <Files Include="C:\Versioning\**\file.version" />
    </ItemGroup>
    <Target Name="OutputFilesAndVersions" DependsOnTargets="RetrieveVersions">
        <Message Text="@(Files->'%(Identity): %(Version)')" />
    </Target>
    <Target Name="RetrieveVersions" Inputs="@(Files)" Outputs="%(Files.Identity)">
        <ReadLinesFromFile File="%(Files.Identity)">
          <Output TaskParameter="Lines" PropertyName="_Version"/>
        </ReadLinesFromFile>
        <PropertyGroup>
            <MyFileName>%(Files.Identity)</MyFileName>
        </PropertyGroup>
        <ItemGroup>
            <Files Condition="'%(Files.Identity)'=='$(MyFileName)'">
                <Version>$(_Version)</Version>
            </Files>
        </ItemGroup>  
    </Target>
</Project>

这基本上也是我想到的。谢谢! - MSB
1
@DanielNolan - 你能否在这个答案中添加一些解释,帮助人们了解目标批处理以及为什么这个答案有效?有些人需要温和的提醒,而其他人则需要一个简短的教程。 - JJS
@JJS 感谢您的反馈。我已经在我的回答开头添加了解释。 - Dan Nolan
1
请在文本和示例中将@Files项引用更正为@(Files) - tm1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接