Msbuild 不同ItemGroup的不同ItemDefinitionGroup

Msbuild 不同ItemGroup的不同ItemDefinitionGroup,msbuild,Msbuild,我目前正在使用MSBuild,在其中一个vcxproj文件中,我希望为不同的ItemGroup创建不同的ItemDefinitionGroup,而不必相互重写,以便每个ItemGroup都有自己的特定定义,例如 <ItemDefinitionGroup Label="ItemDefGroupA"> <CLCompile> <AdditionalOptions> /option_for_item_group_A</Additiona

我目前正在使用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>

/项目组A的选项
/项目组的选项
这可能吗


非常感谢您,祝您度过愉快的一天。

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

所以,你现在所做的是行不通的。您只有一个
CLCompile
项目组,多个项目定义组相互覆盖。无论定义组最后评估的是什么,它都将获胜。请注意,首先计算项目定义,然后在下一个过程()中计算项目定义

对于您的场景,一个可能的解决方法是创建两个辅助组,如下所示:

<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>

/项目组A的选项
/项目组的选项

谢谢S.T.这实际上是一个非常干净的解决方法。我将在我的项目中使用它。再次感谢您的快速回复和出色的解决方案。