我正在重新构建现有的代码库。我们正在转向SVN,期待软件活动的增加,我需要一个可扩展且强大的结构。
我希望我们的要求与其他公司的要求不太一样,所以我会从你们那里得到一些反馈。
问题
我有很多项目:图书馆和应用程序。应用程序依赖于库,还有一些库相互依赖。
我们有很多产品。每个产品都是一个MSI,其中包含一些库和一些应用程序。
项目是C ++,它们之间的依赖关系是头文件和导入库/ DLL - 我们目前正在Windows下开发,但最终将移植到MACOS和Linux。
虽然每个项目都是其中一些项目的独立实体,但我们最终会同时更新其中的几个项目。例如,在处理app_0时,我们可能会更改lib_a中的一些代码(可能是错误修复,添加功能等)。 但我们不想强迫开发人员不得不经常检查项目依赖项的来源。
潜在解决方案
每个项目都在SVN中的自己的目录中,并且有一个'dependencies.txt'文件,列出了它需要的标题,.libs和.dll以及应该在磁盘上创建它们的位置。签出项目后,脚本会自动解析此文件以检索依赖项。从服务器获取二进制文件时,将从SVN(部分签出)检索头文件。
项目遵循通常的主干/标签/分支结构。
在磁盘上,每个项目都位于自己的目录中,采用扁平结构。输出目录包含二进制文件,这些二进制文件通过构建项目生成,或者由于处理'dependencies.txt'文件而从服务器复制。
这种结构意味着我们可以在project_1上工作而无需检查lib_a的源代码。但是我们仍然可以将库检入'./lib_a'并使用其源代码而不对project_1进行任何修改,因为头文件和导入库的位置保持不变。
'installer'项目用于发布软件。该项目将检查发布所需的所有项目并构建它们。
在发布期间,将为所有项目创建“发布”分支。应该发布的所有更改都将提交给它。这样我们只需要在checkout(跟踪发布分支)上运行更新即可获得最新的更改。
答案 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,他们可以修改子项目,即使它在标签目录上。您将需要某种预提交钩子,以防止有人更改标签。