【问题标题】:Macros/Environment variable in .sln and .vcproj files for Visual studioVisual Studio 的 .sln 和 .vcproj 文件中的宏/环境变量
【发布时间】:2009-05-08 15:39:11
【问题描述】:

我有两个类似的问题:

a) 我有一个包含多个项目的解决方案,我希望能够通过设置一些环境变量/宏来轻松切换项目位置。 例如,这个项目可以位于 \SolutionDir\Dir1\ 或 \SolutionDir\Dir2\ 所以,我想指定它应该位于 \SolutionDir\$(Var) 并设置变量。

有没有在 Visual Studio 中构建的方法?

我目前只知道两种解决方案 - 手动/以编程方式编辑 .sln 文件以找到该项目并设置正确的路径。

我无法在 .sln 文件中使用环境变量。

b) 我有一个包含资源(.rc 和 .h)文件的项目。我希望能够通过其他环境变量或宏来设置它们的位置。

类似\ProjectDir\$(Var2)\resource.rc

我在属性表上找到了一些有希望的信息,但是当我在 .vcproj 的文件标记中使用宏时,Visual Studio 不会扩展宏。

感谢您提出解决此问题的任何想法。

问候, 维克多

【问题讨论】:

  • 有趣。但我不明白你为什么要这样做。可能有不同的方法可以解决您要解决的问题。
  • 我想将项目设置为可在不同 OEM 的产品品牌版本之间轻松切换。

标签: visual-studio project path solution


【解决方案1】:

只需在相关字段中使用环境变量即可:

OutputDirectory="$(MyEnvVariableName)\Bin"

一个技巧是每次更改变量时都需要重新启动 Visual Studio IDE。

有一篇 MSDN 文章正是关于此:How to: Use Environment Variables in a Build

【讨论】:

    【解决方案2】:

    我想我的目标和你一样:我想使用环境变量来定位解决方案文件 (.sln) 中的一些项目,并使用一些环境变量来定位我的项目中的一些文件。

    我找到了一种方法,它对我来说很好(使用 Visual Studio 2005): - 使用文本编辑器编辑 .sln 文件并使用具有以下语法的环境变量 %MyEnvironmentVariable% - 编辑 .vcproj 文件并将所需文件的路径替换为一些变量,语法如下 $(MyEnvironmentVariable)。

    希望对您有所帮助... 西里尔

    【讨论】:

    【解决方案3】:

    实现您在 b) 中描述的最佳方法是使用属性表。也可以看看这个similar question

    我发现了一些很有希望的信息 属性表,但 Visual Studio 我使用时不扩展宏 它们在 .vcproj 的 File 标记中。

    我不确定您使用的是哪个版本的 VS。 VS2008 允许您定义例如这样的包含目录:“$(OpenCVInclude)\cxcore\include”。我用它所有的时间。 OpenCVInclude 是在属性表中定义的宏。

    至于问题 a),我认为没有“干净”的方式来做你想做的事。作为替代方案,您可以使用配置管理器:

    • 在解决方案中包含所有项目。
    • 以不同的方式命名项目,例如基于 OEM。
    • 为每个项目在解决方案中定义发布和调试配置
    • 在“Build->Configuration Manager”中,您可以选中或取消选中每个配置的“Build”列。检查相关项目的“构建”。

    【讨论】:

      【解决方案4】:

      我不确定您是只构建 C++ 项目还是同时构建 C#\VB 项目,但 Visual Studio 的一大优点是所有项目实际上都只是 MSBuild 项目。如果您在文本编辑器中编辑项目,您将看到在项目结束时它会导入一个 .targets 文件。如果您跟踪并找到后续导入,您会发现几乎所有 VS 项目都导入 Microsoft.Common.Targets。 Microsoft.Common.Targets 导入 Custom.Before.Microsoft.Common.Targets。使用此导入,您可以使用自己的自定义操作导入自己的目标文件。

      例如,我有一个目标文件,该文件具有在解决方案中的所有项目中定义的公共属性以及在每个项目构建结束时处理的自定义构建后事件。

      使用此扩展方法并通过在解决方案中创建除了标准版本\调试之外的自定义配置,您应该能够根据需要创建尽可能复杂的构建配置。

      【讨论】:

        【解决方案5】:

        (一) Cyrille 为您的要求提供了一个不错的解决方案。另一种方法是将可更改的设置保存在一个共同的地方。请注意,这不适用于 *.sln 和 *.vcproj 等非 msbuild 文件(直到 VS 2010)。

        项目文件: ... $(ChangeableDir)\foo.cs

        Common.targets: 改变这个 ...

        但是,我认为这不是一个很好的做事方式。如果您正在构建的功能之间的差异很大,您应该考虑在源代码控制系统中创建一个分支。 OTOH,如果差异很小 - 例如硬编码字符串 - 那么这会导致您的第二个问题......

        (b) 您描述的资源管理类型本质上与人们将项目本地化为不同语言所面临的问题相同。幸运的是,自 2005 年以来,Visual Studio 中内置了直接支持。查看以前的问题,例如:Localization in Visual Studio 2008

        【讨论】:

          【解决方案6】:

          一种解决方案是在启动 VS 之前设置一些环境变量。在我们的项目中,我们使用如下所示的批处理文件:

          SET ROOT=D:/root
          SET COMPILER_ROOT=C:/Program Files (x86)/Microsoft Visual Studio 12.0/Common7/IDE
          start "Microsoft Visual Studio 12.0" /D"%COMPILER_ROOT%\" "%COMPILER_ROOT%/devenv.exe" "%ROOT%\trunk\OurSolution.sln"
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2013-12-25
            • 1970-01-01
            • 1970-01-01
            • 2011-01-01
            • 2019-08-27
            • 1970-01-01
            • 2014-10-02
            相关资源
            最近更新 更多