SVN:跨项目共享通用库/代码

时间:2013-05-07 10:32:09

标签: svn version-control repository

我正在重新构建现有的代码库。我们正在转向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
    • dependencies.txt
    • 构建
      • project_1.cpp

这种结构意味着我们可以在project_1上工作而无需检查lib_a的源代码。但是我们仍然可以将库检入'./lib_a'并使用其源代码而不对project_1进行任何修改,因为头文件和导入库的位置保持不变。

'installer'项目用于发布软件。该项目将检查发布所需的所有项目并构建它们。

在发布期间,将为所有项目创建“发布”分支。应该发布的所有更改都将提交给它。这样我们只需要在checkout(跟踪发布分支)上运行更新即可获得最新的更改。

1 个答案:

答案 0 :(得分:2)

处理依赖性问题有几种方法:

  • 使用版本库并将头文件视为已发布的软件。您可以使用wget来提取库和头文件的正确版本。优点是你没有在Subversion存储库中检查大块二进制代码。 Subversion确实处理二进制文件,但它们在您的存储库中占用了大量空间。

  • 您可以使用svn:externals属性。这允许您自动将另一个存储库目录包含在另一个目录中。但是,要非常非常小心!

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

trunk/project_A
trunk/project_B
trunk/subproject

您想在trunk/subproject中加入project_A,并在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,他们可以修改子项目,即使它在标签目录上。您将需要某种预提交钩子,以防止有人更改标签。