2013-05-07 125 views
3

我正在重新构建现有代码库。我们正在转向SVN并期待软件活动的增加,我需要一个可扩展和强大的结构。SVN:跨项目共享公用库/代码

我希望我们的要求与其他公司的要求不太相似,所以我会从你们那里得到一些反馈。

问题

我有一些项目:库和应用程序。应用程序依赖于库,而且一些库依赖于对方。

我们有很多产品。每个产品都是包含一些库和一些应用程序的MSI。

这些项目是C++,它们之间的依赖关系是头文件和导入库/ DLL--我们目前正在Windows下开发,但最终将移植到MACOS和Linux。

尽管每个项目都是其中一些项目的独立实体,但我们最终同时更新了其中的几项。例如,在处理app_0时,我们可能会更改lib_a中的某些代码(可能是错误修复,添加的功能等)。 但是我们不想强迫开发人员总是检查项目依赖关系的来源。

潜在的解决方案

每一个项目是在SVN自己的目录,并有一个“dependencies.txt”文件中列出的头,和的.libs .DLL文件它需要以及这些应该在磁盘上创建。一旦检出项目,脚本会自动分析此文件以检索依赖项。头文件从SVN中检索(部分检出),而二进制文件则从服务器中获取。

项目遵循通常的干线/标签/分支结构。

在磁盘上,每个项目都位于其自己的目录中,处于扁平结构中。输出目录包含二进制文件,这可以通过构建项目或作为处理'dependencies.txt'文件的结果从服务器复制而生成。

  • 输出
    • win32_debug
      • lib_a.lib
      • lib_a.dll
  • lib_a
    • 公共
      • lib_a.h
      • other.h
  • PROJECT_1
    • 依赖。TXT
    • 构建
    • 来源
      • project_1.cpp

这种结构意味着我们可以在PROJECT_1工作,而无需检出来源lib_a。但是我们仍然可以将库检出到'./lib_a'中,并且不用修改project_1就可以使用它的源文件,因为头文件和导入库的位置保持不变。

“安装程序”项目用于发布软件。该项目将签出发布所需的所有项目并构建它们。

在发布期间,为所有项目创建“发布”分支。所有应该进入发行版的变化都将付诸实施。这样我们只需要在结帐(跟踪发布分支)上运行更新以获取最新的更改。

+0

你有问题要问? – 2013-05-07 11:24:21

+0

寻求有关如何解决所陈述的问题和/或对我提出的解决方案的意见的建议。 – JPh 2013-05-07 13:55:26

+0

@JPh - 你最终做了什么? – DemiSheep 2014-06-09 18:26:51

回答

2

有处理相关性问题的几种方法:

  • 使用版本库和对待你的头文件作为发布的软件。您可以使用wget来提取正确版本的库和头文件。优点是你没有在你的Subversion版本库中检查大块的二进制代码。 Subversion不会处理二进制文件,但是它们占用了存储库中的大量空间。您可以使用svn:externals属性。这允许您自动将另一个存储库目录包含在另一个目录中。但是,要非常非常小心!

想象一下,你有以下几种:

trunk/project_A 
trunk/project_B 
trunk/subproject 

您想要在project_Atrunk/subproject,并设置上project_A以下属性:

$ svn propset svn:externals "/trunk/subproject subproject" . 

当你分支project_A,你子项目仍然在主干上。不是你想要的。如果您标记project_A,那么该标记不会是快照,因为subproject仍然指向中继线。有几种处理方法:

  • 使用相对目录。那就是,svn propset "svn:externals ../subproject" subproject .。这将确保您在分支project_A时,它将查看您的子项目的分支而不是中继。当您标记project_A。标签将指向子项目的相同标签。问题是你必须用project_A分支和标记你的子项目。

  • 使用特定版本。您可以使用-r参数将特定版本的子项目修复为project_A,或者您可以简单地使用标记。无论如何,您已经及时冻结了子项目。 Word o'警告:如果有人签出project_A,他们可以修改子项目,即使它位于标签目录中。您将需要某种预先提交钩子来防止某人更改标签。

+0

与评论搞乱的道歉 - 没有意识到迫切要求贴出来! (1)发布回购听起来不错。 (2)外部声音的相对网址听起来很有趣,将会进行调查。不知道如何处理引用与lib相同的lib的多个项目将被多次检出... – JPh 2013-05-07 14:03:15

+0

看看[External Definitions](http:// svnbook)上在线Subversion手册中的章节。 red-bean.com/en/1.7/svn.advanced.externals.html) – 2013-05-07 14:32:09