你可以采取的另一种方法是使用Subversion
外部资源属性来管理你的代码,无论是在单个仓库还是在分离的仓库中。优点是当你需要在解决方案中共享代码的新版本时,你只需简单地更新相关的URL即可。
注意: 我不记得Visual Studio解决方案和项目组织的任何内容了;自从我没有做过Windows开发已经有至少5年了。尽管如此,无论文件/目录布局如何,本文讨论都是适用的。我将虚构一个例子,请根据实际情况进行调整。
假设你有一个包含所有相关项目的大型仓库。如果你认为这并不一定可扩展,我建议你看看Apache projects SVN setup;他们所有的项目都在一个仓库里。借鉴ASF的方式,我们开始构建仓库结构,如下所示:
/SolutionA/trunk
/SolutionA/tags
/SolutionA/branches
/SolutionB/trunk
/SolutionB/tags
/SolutionB/branches
/SharedClassLib/trunk
/SharedClassLib/tags
/SharedClassLib/branches
/SharedWebService/trunk
/SharedWebService/tags
/SharedWebService/branches
到目前为止,这只是一个标准的SVN布局;每个相对独立的实体都有自己的存储库区域可供使用。现在,假设您一直在开发SharedClassLib,并且您已经达到了2.0.0版本,在SharedWebService上您的版本为1.2.5。目录布局将类似于:
/SharedClassLib/tags/1.0.0
/SharedClassLib/tags/1.5.0
/SharedClassLib/tags/2.0.0
/SharedWebService/tags/1.0.0
/SharedWebService/tags/1.2.0
/SharedWebService/tags/1.2.5
其他标签只是为了说明您的开发工作已经在不断进行并且您已经发布了多个版本。
现在,回到SolutionA,您有一个LocalClassLibrary项目和一个LocalWebApp项目。这些项目严格属于此解决方案,不与此解决方案之外的任何内容共享。尝试一下目录布局,您的主干可能如下所示:
/SolutionA/trunk/SolutionA/<some_solution_level_files>
/SolutionA/trunk/SolutionA/LocalClassLibrary/<some_project_level_files>
/SolutionA/trunk/SolutionA/LocalWebApp/<some_project_level_files>
所以,我们的问题是如何将SharedClassLib和SharedWebService放入SolutionA中?通过使用Subversion externals。首先阅读externals网页,然后回到这里。
为了让您的生活变得更加轻松,我建议在解决方案目录中创建一个svn.externals文件来设置svn:externals属性(如果您是从命令行执行此操作)。如果您使用其他工具,请记住,在这种情况下,您需要添加多行。该文件将如下所示:
SharedClassLib http://your.svn.server/SharedClassLib/tags/2.0.0
SharedWebService http://your.svn.server/SharedWebService/tags/1.2.5
编辑 1: 此时,您可以看到所引用的URL是完全限定的。这意味着它们可以是单独的存储库,您不必使用我在此处描述的布局。此外,如果您在开发的中间阶段,并且需要使用共享代码的最新开发版本,请使用类似于
http://your.svn.server/SharedClassLib/trunk
的URL。但是,在标记和发布解决方案之前,您最终会想要选择一个稳定版本的外部代码。
编辑 2: 请注意,这是1.5之前的svn语法。在1.5中已经有所改变。
在解决方案目录中执行
svn propset svn:externals -F svn.externals .
,然后执行
svn commit && svn update
。此时,svn将使用那些URL的内容填充您的工作副本。您的工作副本将类似于:
./SolutionA/svn.externals
./SolutionA/<some_solution_level_files>
./SolutionA/LocalClassLibrary/<some_project_level_files>
./SolutionA/LocalWebApp/<some_project_level_files>
./SolutionA/SharedClassLibrary/<some_project_level_files>
./SolutionA/SharedWebApp/<some_project_level_files>
当您需要引入共享项目的新版本时,请适当更新svn:externals属性。请注意,这种方法有一些注意事项,在SVN外部文档中有详细说明。主要是不要指望在./SolutionA/SharedClassLibrary中进行更改,并期望在提交SolutionA时自动捕获更改。
现在,您已准备好将SolutionA发布到世界上。只需创建相应的标签(svn copy)从主干到标签目录即可:
/SolutionA/tags/1.0.0
现在,您的解决方案A将在正确的标签/版本中拥有自己的代码,并且您正在使用该发布版本的共享项目的正确版本。显然,相同的讨论也适用于解决方案B。如果我上述内容有任何错误,请见谅,因为我已经有一段时间没有使用SVN了。