【问题标题】:Visual Studio 2012 "conditional" project settingsVisual Studio 2012“条件”项目设置
【发布时间】:2014-02-28 08:29:09
【问题描述】:

我有以下场景:

  • 两个 Visual Studio C++ 解决方案 - 一个在内部使用,一个应该是 作为示例代码发送给客户。两种解决方案在配置数量和可用项目数量上有所不同

  • 这两个解决方案有一个共同的项目,我需要根据包含它的解决方案进行一些自定义

  • 我需要根据父解决方案自定义如下:

    • 可用的项目配置数量 - 我有 4 个用于内部解决方案的配置,只有 2 个用于交付的客户配置
    • 一些后期构建命令
    • 一些包含路径
    • 仅针对随客户端解决方案提供的项目的定义
  • 我要避免的是为客户提供的解决方案创建和维护一个单独的项目文件

我尝试使用属性表,但我认为这解决了与我不同的问题,主要是在不同项目之间共享配置。我还在研究如何在项目属性文件中使用 Condition 属性,看看这是否对我有帮助(仍在调查中)。

编辑:我不允许使用任何项目生成工具,如 CMake、premake 等。

在 Visual Studio 中有什么方法可以实现我的需要吗?关于如何改进我目前的设置的任何建议 - 也许这两种解决方案可以避免?

【问题讨论】:

  • 您是否已经考虑过有条件地导入子项目文件(MSBuild 处理此类内容的方式)?
  • @Filburt 我该怎么做?我曾尝试寻找有关子项目的文档,但找不到太多 - 是某种隐藏功能(我来自 Makefile 世界,因此在 VS 和 MSBuild 方面缺乏多功能性)

标签: visual-studio visual-c++ visual-studio-2012 projects-and-solutions


【解决方案1】:

由于 Visual Studio 项目由 MSBuild 处理,因此可以根据您的需要进行自定义。

将自定义目标项目文件导入现有的 .vcxproj 可能如下所示:

        <!--
        ...
        way to the end of your .vcxproj file

        -->

        <!-- start of custom import part -->

        <Import Project=".\YourInternal.targets" Condition="Exists('.\YourInternal.targets')" />

        <!-- end of custom import part -->

        <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
        <ImportGroup Label="ExtensionTargets">
    </ImportGroup>
</Project>

您的 .vcxproj 将仅包含您要交付给客户的项目/配置/命令的子集 - 与您的内部构建过程相关的所有内容都将包含在一个或多个 .targets 项目文件中,该文件将被排除在交付之外给您的客户。

例如,如果您有一个内部 Custom Build Step \ Execute Before \ Clean,您可以将其从您的 .vcxproj 文件中删除并将其添加到您的 YourInternal.targetsproject 文件中:

<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
    <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
        <CustomBuildBeforeTargets>Clean</CustomBuildBeforeTargets>
    </PropertyGroup>
</Project>

如果您有一组需要扩展以进行内部处理的项目,您可以将 .vcxproj 的基本集与 .targets 文件中的其他项目连接起来:

.vcxproj

...
<ItemGroup>
    <ClInclude Include="Header.h" />
</ItemGroup>
...

.targets

<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
    <ItemGroup>
        <!-- includes to items definded in your .vcxproj -->
        <ClInclude Include="@(ClInclude)" />

        <!-- add more items here -->
        <ClInclude Include="Foo.h" />
        <ClInclude Include="Bar.h" />
    </ItemGroup>
</Project>

这些示例只是初步了解了通过 MSBuild 命令扩展 .vcxproj 可以实现的目标。

【讨论】:

  • 感谢您为我指明了正确的方向。虽然它可以工作,但它有两个主要缺点: 1. IDE 不知道它(这有多愚蠢?),所以如果我通过 IDE 中的管理器修改一些属性,那么它会被写入原始文件 - a有点噩梦。 2. 没有简单的方法可以覆盖一个属性; .targets 文件中的优先级最低,所以我必须做一些基于条件的技巧。总而言之,我现在不相信该方法实际上比拥有 2 个不同的项目文件更好。
  • 我的示例只是扩展/覆盖的一种可能方式 - 如果您将自定义 .targets 包含在 .vcxproj 的顶部,您可以反过来对行为进行建模并让您的 .vcxproj 优先.当然,没有直接的方法可以通过 IDE 进行编辑。我自己在处理 .csproj 并且不得不承认 .vcxproj 在很多方面都不同。至少 MSBuild 会在每次构建之前让您免于使用 .vcxproj 摆弄 Xml 的任何时髦工具链。
【解决方案2】:

您可以使用一些 XSLT 处理来清理内部项目和您要发送给客户的单独解决方案文件。

【讨论】:

  • 你能举个例子吗?
  • 这不是标准解决方案,需要某种工具来实际进行处理。这是我刚想出来的,因为最终项目文件只是普通的 XML 文档。
【解决方案3】:

您可以使用像premake 这样的项目生成工具。它使用LUA生成解决方案和项目,因此您绝对可以根据父解决方案自定义项目设置。

【讨论】:

  • 很遗憾,我无法使用该工具或任何其他此类工具。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-27
  • 1970-01-01
相关资源
最近更新 更多