我有三种解决方案,其中方案A需要在编译之前使用方案B和C中的DLL构建版本。将它们合并到一个解决方案中是不可能的...
到目前为止,似乎Visual Studio不支持解决方案引用,如果我尝试使用msbuild这样的方式,它会聪明地知道你正在从另一个解决方案构建一个解决方案等等。总体目标是让多个解决方案看起来几乎像只有一个 - 就是方案A。
我相信这是一个常见的问题,但如何很好地将它们链接起来呢?
我有三种解决方案,其中方案A需要在编译之前使用方案B和C中的DLL构建版本。将它们合并到一个解决方案中是不可能的...
到目前为止,似乎Visual Studio不支持解决方案引用,如果我尝试使用msbuild这样的方式,它会聪明地知道你正在从另一个解决方案构建一个解决方案等等。总体目标是让多个解决方案看起来几乎像只有一个 - 就是方案A。
我相信这是一个常见的问题,但如何很好地将它们链接起来呢?
我最近发现,在Visual Studio 2008中,您可以在多个解决方案中包含现有项目。到目前为止,唯一的缺点似乎是,如果您对共享项目进行更改并且打开使用该共享项目的多个解决方案,则会被要求“重新加载”其他解决方案。
因此,只需将“现有项目添加”到需要该项目的所有解决方案中即可。我在当前站点上使用TFS,看起来源代码控制没有问题。
<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无法构建,则抛出消息警报。
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
如果您无法将项目B和C放入与项目A相同的解决方案中,则无法确保在构建项目A时包含最新源代码的B和C二进制文件。
我看到的最简单的解决方案是在源代码存储库中有一个公共文件夹,每个项目都会将其二进制文件复制到该文件夹中(如果需要共享)。然后,所有其他项目都可以引用该文件夹中的二进制文件,只要您的本地文件夹看起来与存储库相同即可。
这不是完美的解决方案,但很容易使用。
你可以将一个 Makefile 项目添加到解决方案 A 中,该项目将使用 msbuild 构建你的解决方案 B 和 C,并使 A 中的所有项目依赖于该 Makefile 项目。这样你就无法向 B 和 C 中的项目添加项目引用,但可以使用 dll 引用,它们将始终从最新的源代码构建。