不同ItemGroup的不同ItemDefinitionGroup

时间:2015-04-14 12:52:28

标签: msbuild

我目前正在使用MSBuild,并且在其中一个vcxproj文件中,我希望为不同的ItemGroup提供不同的ItemDefinitionGroup,而不会相互覆盖,以便每个ItemGroup都有自己的特定定义,例如

<ItemDefinitionGroup Label="ItemDefGroupA">
    <CLCompile>
        <AdditionalOptions> /option_for_item_group_A</AdditionalOptions>
    </CLCompile>
</ItemDefinitionGroup>

<ItemGroup Label="ItemGroupA">
    <CLCompile Include="src\main.cpp" />
</ItemDefinitionGroup>

<ItemDefinitionGroup>
    <CLCompile>
        <AdditionalOptions> /option_for_item_group_B</AdditionalOptions>
    </CLCompile>
</ItemDefinitionGroup>

<ItemGroup Label="ItemGroupB">
    <CLCompile Include="src\main2.cpp" />
</ItemDefinitionGroup>

这甚至可能吗?

非常感谢你,祝你有个美好的一天。

1 个答案:

答案 0 :(得分:3)

MSBuild执行引擎会忽略Label属性。使用它的唯一地方是IDE代码,需要知道项目文件中的位置以插入新实体,如果在Visual Studio中修改项目,则会发生这种情况。 MSDN blog提供了有关IDE如何使用Label的一些信息。

所以,你正在做的事情是行不通的。您只有一个CLCompile项目组,并且您的多个项目定义组会相互覆盖。无论最后评估什么定义组,它都会获胜。请注意,首先评估项目定义,然后在下一遍(link)上评估项目。

您的方案的一种可能的解决方法是创建几个辅助组,如下所示:

<ItemGroup>
    <GroupA Include="src\file1.cpp" />
    <GroupA Include="src\file2.cpp" />
</ItemDefinitionGroup>

<ItemGroup>
    <GroupB Include="src\file3.cpp" />
    <GroupB Include="src\file4.cpp" />
</ItemDefinitionGroup>

然后,您可以从具有不同元数据值的两者的组合初始化CLCompile组:

<ItemGroup>
    <CLCompile Include="@(GroupA)">
        <AdditionalOptions> /option_for_item_group_A</AdditionalOptions>
    </CLCompile>
    <CLCompile Include="@(GroupB)">
        <AdditionalOptions> /option_for_item_group_B</AdditionalOptions>
    </CLCompile>
</ItemDefinitionGroup>