是否可以使用默认的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>
答案 0 :(得分:1)
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>