如何在MSBuild脚本中将ItemGroup元数据作为属性访问

4

是否可以使用默认的MSBuild技术将项目组中的列表作为属性访问?我知道我可以在C#中的自定义任务中实现此功能,但如果可能的话,我想使用内置的能力。

例如:

我有一个项目组:

<ItemGroup>
    <SolutionToBuild Include="$(SolutionRoot)\Solutions\ClassLib\ClassLib.sln">
      <Properties>
        AssemblySigningKey=MySigningKey;
        OutDir=$(BinariesRoot)\SomeLocation\;
        LibraryName=ClassLib;
        PlatformTarget=x86;
      </Properties>
    </SolutionToBuild>

    <SolutionToBuild Include="$(SolutionRoot)\Solutions\BLAH\BLAH.sln">
      <Properties>
        ProjectType=Web;
      </Properties>
    </SolutionToBuild>
</ItemGroup>

如果存在,我想提取AssemblySigningKey的值,并将该值放入一个MSBuild变量中。

我尝试过一些方法,最接近的示例是在单独的目标中使用转换,但即使我能让Condition起作用,我仍然需要在分割=时解析出该值。是否有标准方法可以在项目组内访问此元数据?

<Target Name="TransformProps"
        Inputs="%(SolutionToBuild.Identity)"
        Outputs="_Non_Existent_Item_To_Batch_">

    <PropertyGroup>
        <IncludeProps>%(SolutionToBuild.Properties)</IncludeProps>
    </PropertyGroup>

    <ItemGroup>
        <IncludeProps Include="$(IncludeProps)" />
        <Solution Include="@(SolutionToBuild)">
          <IncludeProps Condition="'True'=='True' ">@(IncludeProps ->'-PROP %(Identity)', ' ')</IncludeProps>

        </Solution>
    </ItemGroup>
</Target>

我的主要目标将以以下方式调用转换:

<Target Name="Main"  DependsOnTargets="TransformProps">    
    <Message Text="Solution info:  %(Solution.Identity) %(Solution.IncludeProps)" />
</Target>

SolutionsToBuild元素及其子元素“Properties”的ItemGroup结构已经存在,我无法更改。这是您所指的吗?如果您有建议,请详细说明,我愿意尽力更改。 - Jay
我想确切地知道你写了什么 - 你的ItemGroup结构已经给出,不能更改。既然我确定了,我现在会尝试一下。 - Marcos Brigante
1个回答

2

项目元数据是使用XML标签声明和转换的。看起来你正在使用MSBuild任务构建一些解决方案 - 属性标签是这个任务特定的参数。

像你尝试过的逗号分隔列表和项目转换并不能帮助,因为你仍然需要等号作为从键到值的链接,正如你提到的那样。我认为没有办法获取签名密钥值而不进行解析。毕竟,msbuild不将属性列表视为元数据,它只是一个字符串列表。

我编写了下面的脚本,以示例说明msbuild如何声明和读取元数据。但由于您的ItemGroup结构无法更改,因此它不适用于您。

在我看来,在这种情况下,您别无选择,只能使用自定义任务并进行解析。如果您使用的是msbuild 4.0,请使用内联任务

<?xml version="1.0" encoding="UTF-8" ?>
<Project DefaultTargets="Main" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <ItemGroup>
    <SolutionToBuild Include="$(SolutionRoot)\Solutions\ClassLib\ClassLib.sln">
      <AssemblySigningKey>MySigningKey123</AssemblySigningKey>
      <Properties>
        AssemblySigningKey=MySigningKey456;
        OutDir=$(BinariesRoot)\SomeLocation\;
        LibraryName=ClassLib;
        PlatformTarget=x86;
      </Properties>
    </SolutionToBuild>
  </ItemGroup>

  <Target Name="TransformProps">
    <PropertyGroup>
      <MySigningKey>@(SolutionToBuild->'%(AssemblySigningKey)')</MySigningKey>
    </PropertyGroup>
  </Target>

  <Target Name="Main"  DependsOnTargets="TransformProps">
    <Message Text="My desired Property Value:  $(MySigningKey)" />
  </Target>

Marcos,谢谢你的信息。我得出了类似的结论,并最终使用自定义构建任务来解析和修改元数据。我很快会发布我的解决方案。 - Jay

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