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

时间:2013-03-05 15:07:50

标签: msbuild msbuild-4.0

是否可以使用默认的MSBuild技术作为msbuild中的属性访问项目组中的列表?我知道我可以在C#中的自定义任务中执行此操作,但是如果可能的话,我正在尝试使用内置功能。<​​/ p>

示例:

我有一个项目组:

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

1 个答案:

答案 0 :(得分:1)

使用xml标记声明和转换

Items Metadata。您似乎正在使用MSBuild Task构建一些解决方案 - 属性标记是特定于此任务的参数。

您尝试过的逗号分隔列表和项目的转换不会有帮助,因为正如您所提到的,您仍然具有等号作为从键到值的链接。我认为没有解析就无法获得签名密钥值。在所有msbuild都不将属性列表视为元数据之后,它只是一个字符串列表。

我在下面的脚本中举例说明了msbuild如何声明和读取元数据。它不是您的选项,因为您的ItemGroup结构无法更改。

在这种情况下,恕我直言你没有选择,但使用自定义任务并进行解析。如果您使用msbuild 4.0构建,请使用Inline Tasks

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