2010-10-07 65 views
1
构建一个大型的多应用程序的代码库的正确方法

我们目前得到了与codesion,http://John.svn.cvsdude.com单一回购,用一个单一的SVN项目http://John.svn.cvsdude.com/MyProject,它包含了个人的Visual C几个子目录++解决方案什么是SVN

这一切都是作为一个应用程序开始的,虽然我们已经分离了单独的库项目以供将来重用,但它仍然是同一个SVN项目。假设我们的目标是在库中使用一些重叠的应用程序,在SVN中设置它的最佳方法是什么?当然,我们可以保留一个SVN项目,并将应用程序项目和图书馆项目作为子目录,但这似乎不太可能。假设我们有App1,App2,App3和LibraryA,LibraryB,LibraryC,LibraryD,这些都是单独的项目/解决方案......您将如何在一个(或多个回购)下组织这个项目?有最佳做法吗?

回答

2

我会保留一切一个仓库,把每一个项目和库在仓库的单独根目录(见Planning Your Repository Organization了解详细信息)。

请记住,存储库结构不必与磁盘上的项目文件结构相同。

另外,我会使用svn-externals来共享库目录(保存为独立的根存储库文件夹)在各种项目之间。

0

我建议以下布局,都在同一个存储库:

App1\ 
    trunk 
    tags 
    branches 
App2\ 
    trunk 
    tags 
    branches 
App3\ 
    trunk 
    tags 
    branches 
LibraryA\ 
    trunk 
    tags 
    branches 
LibraryB\ 
    trunk 
    tags 
    branches 
LibraryC\ 
    trunk 
    tags 
    branches 
LibraryD\ 
    trunk 
    tags 
    branches 

现在,我让你发布时间表几个假设。我假设每个应用程序和库在不同的时间表下发布。实际上这是最坏的情况,但是我的方案会允许这样做。每个应用程序都需要预编译它的依赖关系,并将其包含在存储库的目录中。下面是应用1会怎么看,因为它有图书馆B和C的依赖关系:

App1\ 
    trunk\ 
     deps\ 
      LibraryB, release 1.1 
      LibraryC, release 4.3 
    tags 
    branches 

这意味着只要您支干线你会得到必要的库一起,大大简化了操作。注意它是库的已编译二进制文件,而不是其源文件。

trunk的一个分支将使用上述版本,并且由于您不允许修改它们,因此需要将任何错误修正放入App1中。同时,要使用LibB & C的新版本,您可以在图书馆团队发布时在trunk中更新它们的版本。因此,一段时间后,你的仓库可能是这样的:在树干

App1\ 
    trunk\ 
     deps\ 
      LibraryB, release 1.3 
      LibraryC, release 4.4 
    tags\ 
     release-1.0\ 
      deps\ 
       LibraryB, release 1.1 
       LibraryC, release 4.3 
    branches\ 
     stable-2.0\ 
      deps\ 
       LibraryB, release 1.2 
       LibraryC, release 4.2 

工作被允许使用最新的库版本。版本1.0使用的是固定版本(此处最早的版本),而稳定分支使用的是以前版本的库。

上述方案是我在最后一位雇主身上想到的,但从未执行。为了使它工作,你需要有一个分解成应用程序/库的代码库,开发可以并行进行。对我们来说情况并非如此。但我坚信这是一个有价值的目标。

祝你好运!

P.S.我强烈建议针对 svn:外部。他们可以使分支管理变得更加困难。例如,如果一个外部变化和一个分支依赖于它,你就有可能搞乱那个分支(例如使它不可编译)。

2

这是经过CollabNet,Codesion云服务杰克。首先,感谢您成为Codesion的客户!

您说明您的情况来讲“项目,”但是这是一个含糊的字眼,和Subversion本身有没有它的任何概念都没有。这里真正的考虑不是Subversion本身,而是你的构建工具和发布策略。您需要最能支持您想要的配置。

例如,做所有这些应用程序和库释放所有在一次?完全独立?有些混合?这个答案可能会改变吗?

如果他们都发布一次,再有就是在使其尽可能容易识别每个应用程序的版本是与其他应用程序的哪个版本发布的重要价值。这样,错误报告可以通过一致,一致的方式进行验证,实施修复和补丁合并。要做到这一点,我会使用“/应用程序/ {树干,标签,分支}”,一些人士建议的结构,但与规范

/trunk/app1 
/trunk/app2 
/tags/TAGNAME/app1 
/tags/TAGNAME/app2 
/branches/BRANCHNAME/app1 
/branches/BRANCHNAME/app2 

结构相当棒。这使您可以分支,标签和合并整个树,所有的应用程序和库,在一个单一的命令:

svn cp URL/trunk URL/tags/TAGNAME 

在另一方面,如果这些东西是独立的,那么你有

更好
/app1/trunk 
/app1/tags 
/app1/branches 
/app2/trunk 
/app2/tags 
/app2/branches 
... 

这样,例如,标记一个应用程序不会影响另一个应用程序。

在混合情况下,仍然可以实现协调分支(适当时),但是必须在工作副本中使用分支,也可能使用稀疏检出(如果工作副本很大) 。或者,您可以标记或分支整个存储库,即使标记或分支对其大部分都没有意义:Subversion标记和分支存储起来很便宜,并且(如果使用URL到URL形式的“svn cp “)便宜;不标记无关标签的唯一原因是它混淆了人类。但这是一个非常强大的原因,所以最好使用“app/trunk”结构来处理混合模型,以避免混淆。

你可以在Apache基金会库中的“/应用/主干”的方法很好的例子。所有的Apache项目(包括Subversion本身)都存储在一个Subversion版本库中。那里有大约100个项目,尽管存在一些相互依赖关系,但它们都是独立管理的。你可以从root of all ASF projects开始浏览这个巨大的回购(可能是公共世界中最大的一个Subversion回购)。实践中存在一些差异,但是一个很好的例子是Subversion itself

另外值得一记:在目前为止在Subversion而言,你可以随时更改这个东西。 “标签”和“分支”实际上只是副本;当你喜欢时,你可以自由地重新排列你喜欢的东西。但也有一些注意事项:

  • 它会混淆人类
  • “树冲突”(添加,删除,移动或重命名文件或目录)可以使合并后的痛苦。合并工具的功能是保存你的工作。所有的合并工具最终都要经过一段艰难的合并,然后将决策推回给人类;重要的问题是没有这个问题他们可以得到多少权利。树冲突导致当前的Subversion(1.6或更高版本)比你想要的更频繁地启用。因此,最好不要经常重新安排这些顶级目录,并准备干预并清理跨越此类重新安排的任何合并。
+0

不错的答案杰克,感谢您花时间写下它。 – 2011-01-06 09:45:06