【发布时间】:2013-03-05 15:07:50
【问题描述】:
是否可以使用默认的 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 变量中。
我尝试了一些方法,我能找到的最接近的例子是在单独的目标中使用转换,但即使这看起来有点像 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>
【问题讨论】:
-
SolutionsToBuild 元素及其子“属性”的 ItemGroup 结构已存在,我无法更改。这是你指的吗?如果您有建议,请详细说明,我愿意改变我能改变的。
-
我想确切地知道你写了什么——你的 ItemGroup 结构是给定的,不能改变。我现在肯定会试一试。
标签: msbuild msbuild-4.0