是否可以使用默认的 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
的值, 如果存在,并将此值放入 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>
最佳答案
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/