【问题标题】:How to link multiple visual studio solutions together?如何将多个 Visual Studio 解决方案链接在一起?
【发布时间】:2010-10-15 11:35:57
【问题描述】:

我有 3 个解决方案,解决方案 A 需要从解决方案 B 和 C 构建的 DLL 版本才能编译。无法将其合并到一个解决方案中...

到目前为止,Visual Studio 似乎不支持解决方案引用,如果我尝试这种方式,msbuild 足够聪明,可以知道您正在从另一个等构建一个解决方案。总体目标是尝试使多个解决方案看起来几乎只有一个 - 只是解决方案 A。

我认为这是一个常见问题,但是如何将其很好地联系起来呢?

【问题讨论】:

  • 为什么不能将它们合并到 1 个解决方案中?
  • 另外你为什么不使用msbuild?
  • 我们不能把它放在一个解决方案中,因为 B 和 C 不仅仅用于 A。在开发期间它的构建就像 vs 构建一样;如果 msbuild 效果更好,请说明如何!

标签: visual-studio projects-and-solutions


【解决方案1】:

这个问题已经出现在different,但related,表格中。其实有一个MSDN page that covers this

您正在寻找一种类似于大型系统的分区单一解决方案模型的多解决方案方法。拥有一个“一切”解决方案来构建一切并维护您的组件间依赖关系。这是您在需要构建解决方案 A 时构建的内容。然后您将拥有仅包含组件 B 或 C 的单独解决方案。本质上,您仍将拥有 3 个解决方案,但您会将解决方案 B 和 C 中的项目添加到解决方案中A.

【讨论】:

  • 不过,这个模型也有问题。例如,TFS(-2012) 仍然不够聪明,无法意识到如果您在一个解决方案的上下文中重命名项目,则包含该项目的任何其他解决方案也需要更新(sln 文件中的“引用” )。此外,在现实世界中,您可能正在为大多数东西使用最新的工具 (VS-2012),但仍需要在另一个中开发解决方案的某些部分(例如,对于 BizTalk,VS-2012 仍然不可能afaik),因此“一切”解决方案是不可能的。
  • 在这种情况下,您只需转到具有自定义构建系统的完全分区模型。 :) 这不是一个罕见的情况。
【解决方案2】:

我最近发现,在 Visual Studio 2008 中,您可以将现有项目包含在多个解决方案中。到目前为止,唯一的缺点似乎是,如果您对共享项目进行更改并打开多个使用该共享项目的解决方案,您将被要求“重新加载”其他解决方案。

因此,只需将“添加现有项目”添加到需要该项目的所有解决方案中。我在当前站点上使用 TFS,源代码控制 ether 似乎没有问题。

【讨论】:

    【解决方案3】:

    我相信它应该是您正在查看的项目级别。构建解决方案 B 和 C 中包含的项目,然后在解决方案 A 的相关项目中添加对 DLL 的引用。

    如果你有一个属性组,在 Msbuild 中

    <PropertyGroup>
    
    <SolutionsToBuild>SolutionB</SolutionsToBuild>
    <SolutionsToBuild>SolutionC</SolutionsToBuild>
    <SolutionsToBuild>SolutionA</SolutionsToBuild>
    </PropertyGroup>
    

    然后执行MSBuild任务

    <MSBuild Projects="@(SolutionsToBuild)"/>
    

    希望对你有帮助

    【讨论】:

      【解决方案4】:

      您可以尝试自动化合并过程以节省一些时间: http://code.google.com/p/merge-solutions/

      虽然我们遇到的问题略有不同:大约 15 个解决方案(总共约 150 个项目)使用了一个通用库。问题在于,如果我们试图将所有这些合并为一个以重构/消除公共库中的冗余代码。 1.合并15个解决方案在VS中需要大量的点击和等待 2. 生成的解决方案从来都不是最新的 - 没有人因为它的大小而烦恼更新它

      【讨论】:

        【解决方案5】:

        您可以尝试在项目的预构建事件(在解决方案 A 中)中为您依赖的 dll(在解决方案 B 和 C 中)添加命令行构建命令

        【讨论】:

          【解决方案6】:

          如果您不能将项目 B 和 C 放入与项目 A 相同的解决方案中,那么在构建项目 A 时,无法确保 B 和 C 的二进制文件包含最新的源代码。

          我见过的最简单的解决方案是在源代码存储库中有一个公共文件夹,如果需要共享,每个项目都会在其中复制其二进制文件。然后所有其他项目都可以引用该文件夹中的二进制文件,只要您的本地文件夹看起来与存储库相同。

          不是一个完美的解决方案,但它很容易使用。

          【讨论】:

            【解决方案7】:

            您可以向解决方案 A 添加一个 Makefile 项目,该项目将构建您的解决方案 B 和 C(例如使用 msbuild)并使 A 中的所有项目都依赖于该 Makefile 项目。这样,您将无法将项目引用添加到 B 和 C 中的项目,但您可以使用 dll 引用,它们将始终从最新源构建。

            【讨论】:

              【解决方案8】:

              根据this answer,我建议您创建自己的批处理文件,它将为您构建相关的解决方案。

              这使用起来非常方便,因为构建过程会将构建进度(类似于 Visual Studio 中的输出窗口)输出到每个构建执行的命令promote。

              此外,如果您需要先构建一个解决方案,您可以编写自己的构建顺序,例如:

              1. 构建解决方案 B
              2. 构建解决方案 C
              3. 构建解决方案 A(内部使用“解决方案 B”和“解决方案 C”构建文件)

              我很快写了script to clarify the build order mentioned above 并支持大多数现代 Visual Studio 版本。

              问候。

              【讨论】:

              • 或者使用nant指定构建顺序。每个解决方案构建都可以是目标中的一项单独任务。
              【解决方案9】:

              我通过将脚本放在预构建事件命令行中解决了这个问题,如果项目 A 构建失败,则抛出 msg 警报

              ECHO "build A project"
              set AppMsg ="%SystemRoot%\System32\msg.exe"
              set AppMsg
              if not "%ProgramFiles(x86)%" == "" (
              if exist "%SystemRoot%\Sysnative\*" set AppMsg="%SystemRoot%\Sysnative\msg.exe"
              )
              set AppMsg
              taskkill /f /im "%PROGRAMFILES(X86)%\MSBuild\14.0\Bin\msbuild" "$(SolutionPath)" /t:Project_A_Name /p:Configuration=Debug;TargetFrameworkVersion=v4.5 /p:Platform="Any CPU" /p:BuildProjectReferences=false /p:VSToolsPath="%PROGRAMFILES(X86)%\MSBuild\Microsoft\VisualStudio\v14.0" 2>nul 1>nul
              echo ERRORLEVEL %ERRORLEVEL%
              if ERRORLEVEL 1 (
              ECHO "failed to build test project"
              %AppMsg% * "failed to build test project"
              )
              exit 0
              

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2015-11-28
                • 1970-01-01
                • 2011-03-30
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多