4

是否可以使用默认的 MSBuild 技术来访问项目组中的列表作为 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如果存在),然后将此值放入 M​​SBuild 变量中。

我已经尝试了一些方法,我能找到的最接近的例子是在一个单独的目标中使用一个转换,但即使这看起来有点像 hack,即使我能得到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>
4

1 回答 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>
于 2013-03-06T16:49:36.460 回答