Visual Studio 2012“条件”项目设置

时间:2014-02-28 08:29:09

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

我有以下情况:

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

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

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

    • 可用的项目配置数量 - 我有4个内部解决方案配置,只有2个配置为客户端发送一个
    • 一些帖子构建命令
    • 一些包含路径
    • 一个仅针对客户端解决方案附带的项目的定义
  • 我想避免的是为客户发布的解决方案创建和维护一个单独的项目文件

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

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

Visual Studio中是否有任何方法可以实现我的需求?关于如何改进我到目前为止的设置的任何建议 - 也许可以避免这两种解决方案?

3 个答案:

答案 0 :(得分:2)

由于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.targets项目文件中:

<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 :(得分:0)

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

答案 2 :(得分:0)

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