msbuild - 如何在 MSBuild 脚本中访问 ItemGroup Metadata 作为属性

标签 msbuild msbuild-4.0

是否可以使用默认的 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 变量中。

我尝试了一些方法,我能找到的最接近的例子是在单独的目标中使用转换,但即使这样看起来也有点黑客,即使我可以获得 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>

最佳答案

Items Metadata 是使用 xml 标签声明和转换的。似乎您正在使用 MSBuild Task 来构建一些解决方案 - 属性标签是特定于此任务的参数。

从逗号分隔的列表和您尝试过的项目转换将无济于事,因为正如您所提到的,您仍然拥有等号作为从键到值的链接。我认为没有解析就无法获得签名 key 值。毕竟 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>

关于msbuild - 如何在 MSBuild 脚本中访问 ItemGroup Metadata 作为属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15227172/

相关文章:

c# - 从 MSBuild 命令行或项目文件将/highentropyva- 传递给 CSC 编译器

c# - 如何让 Visual Studio 在构建过程中解析并包含项目的所有依赖项?

c++ - cl.exe 在通过 MSBuild 调用时无限期挂起

msbuild - Hudson 在使用 MSBUILD 构建 CSPROJ 文件时遇到问题吗?

tfs - 是否有用于在本地 tfs 构建代理中进行自动化测试的 postman 插件?

c# - 如何在 Visual Studio 中的生成后事件中写入文本文件?

powershell - 通过Powershell作为命令行参数传递时不考虑Msbuild属性

visual-studio-2010 - VS2010因为修改了无关文件而重建C++项目

environment-variables - MSBuild 无法查看从生成工作流设置的环境变量

msbuild - 如何从正在处理的项目文件中访问msbuild命令行参数?