不同 ItemGroup 的不同 ItemDefinitionGroup
Different ItemDefinitionGroup for different ItemGroup
我目前正在使用 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>
这可能吗?
非常感谢您,祝您有愉快的一天。
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>
我目前正在使用 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>
这可能吗?
非常感谢您,祝您有愉快的一天。
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>