我有 3 个解决方案,解决方案 A 需要从解决方案 B 和 C 构建的 DLL 版本才能编译。无法将其合并到一个解决方案中...
到目前为止,Visual Studio 似乎不支持解决方案引用,如果我尝试这种方式,msbuild 足够聪明,可以知道您正在从另一个等构建一个解决方案。总体目标是尝试使多个解决方案看起来几乎只有一个 - 只是解决方案 A。
我相信这是一个常见的问题,但你如何很好地联系起来呢?
我有 3 个解决方案,解决方案 A 需要从解决方案 B 和 C 构建的 DLL 版本才能编译。无法将其合并到一个解决方案中...
到目前为止,Visual Studio 似乎不支持解决方案引用,如果我尝试这种方式,msbuild 足够聪明,可以知道您正在从另一个等构建一个解决方案。总体目标是尝试使多个解决方案看起来几乎只有一个 - 只是解决方案 A。
我相信这是一个常见的问题,但你如何很好地联系起来呢?
这个问题以不同但相关的形式出现。实际上有一个MSDN 页面涵盖了这一点。
您正在寻找的是类似于大型系统的分区单一解决方案模型的多解决方案方法。拥有一个“一切”解决方案来构建一切并维护您的组件间依赖关系。这是您在需要构建解决方案 A 时构建的内容。然后您将拥有仅包含组件 B 或 C 的单独解决方案。本质上,您仍将拥有 3 个解决方案,但您会将解决方案 B 和 C 中的项目添加到解决方案中一种。
我最近发现,在 Visual Studio 2008 中,您可以在多个解决方案中包含现有项目。到目前为止,唯一的缺点似乎是,如果您对共享项目进行更改并打开多个使用该共享项目的解决方案,您将被要求“重新加载”其他解决方案。
因此,只需将“添加现有项目”添加到需要该项目的所有解决方案中。我在当前站点上使用 TFS,源代码控制以太似乎没有问题。
我相信它应该是您正在查看的项目级别。构建解决方案 B 和 C 中包含的项目,然后在解决方案 A 的相关项目中添加对 DLL 的引用。
在 Msbuild 如果你有一个属性组
<PropertyGroup>
<SolutionsToBuild>SolutionB</SolutionsToBuild>
<SolutionsToBuild>SolutionC</SolutionsToBuild>
<SolutionsToBuild>SolutionA</SolutionsToBuild>
</PropertyGroup>
然后执行 MSBuild 任务
<MSBuild Projects="@(SolutionsToBuild)"/>
希望这可以帮助
您可以尝试自动化合并过程以节省一些时间: http ://code.google.com/p/merge-solutions/
尽管我们遇到了稍微不同的问题:大约 15 个解决方案(总共约 150 个项目)使用了一个通用库。问题是,如果我们试图将所有这些合并为一个,以便重构/消除公共库中的冗余代码。1. 合并 15 个解决方案需要在 VS 2 中进行大量点击和等待。结果解决方案永远不会是最新的 - 没有人因为它的大小而烦恼更新它
您可以尝试为您在项目的预构建事件(在解决方案 A 中)中依赖的 dll(在解决方案 B 和 C 中)添加命令行构建命令
如果您不能将项目 B 和 C 放入与项目 A 相同的解决方案中,那么在构建项目 A 时,无法确保 B 和 C 的二进制文件包含最新的源代码。
我见过的最简单的解决方案是在源代码存储库中有一个公共文件夹,如果需要共享,每个项目都会在其中复制其二进制文件。然后,所有其他项目都可以引用该文件夹中的二进制文件,只要您的本地文件夹看起来与存储库相同。
不是一个完美的解决方案,但它很容易使用。
您可以将 Makefile 项目添加到解决方案 A,这将构建您的解决方案 B 和 C(例如使用 msbuild)并使 A 中的所有项目都依赖于该 Makefile 项目。这样,您将无法将项目引用添加到 B 和 C 中的项目,但您可以使用 dll 引用,它们将始终从最新源构建。
根据这个答案,我建议您创建自己的批处理文件,该文件将为您构建相关的解决方案。
这使用起来非常方便,因为构建过程会将构建进度(类似于 Visual Studio 中的输出窗口)输出到每个构建执行的命令promote。
此外,如果您需要先构建一个解决方案,您可以编写自己的构建顺序,例如:
我已经快速编写了脚本来阐明上面提到的构建顺序并支持大多数现代 Visual Studio 版本。
问候。
我通过将脚本放在预构建事件命令行中解决了这个问题,如果项目 A 构建失败,则抛出 msg alert
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