Subversion和依赖

use*_*133 6 svn version-control dependencies release-management

我正在努力为以下问题找到可行的策略.

我们有几个依赖于我们框架的Web项目.一切都存储在我们的SVN中,并拥有自己的项目,包含所有必要的目录结构(主干,标签,分支).在一个例子中 - 我们有项目webprj01和webprj02,我们有一个框架frm01.所有这些都有通常的SVN项目结构 - 主干,标签,分支机构.

webprj01和webprj01都依赖于frm01,在现实生活中,frm01作为webprj01和webprj02的子目录存在.要在SVN中实现这一点,可以设置svn:external属性,我们可以设置frm01指向webprj01和webprj02的trunk中的/ frm01/trunk.

要进行现实生活中的编码,我们必须将所有三个项目作为工作副本进行检出,并对其自己的工作副本中的特定代码库进行更改.无法将更改从webprj01/frm01发布到SVN.更改需要在frm01工作副本中完成,并通过SVN传输到webprj01/frm01和webprj02/frm01工作副本.

此解决方案在分支时存在依赖性问题.我从SVN/webprj01/trunk创建了一个生产分支到/webprj01/branches/release-1.0.0.在处理第二个项目webprj02和frm01的两天内,我不再能够通过分支发行版1.0.0中的svn:externals进行稳定的结账.目录frm01已经指向frm01/trunk的新变化.

描述的只是问题的简化版本.在我们的现实生活中,依赖关系有时会达到五个层次.我希望能够随时从SVN获得稳定的代码.换句话说.当我将webprj01分支/标记为release-1.0.0时.我希望在创建后的一年内获得该特定标记的稳定代码.

很明显,使用svn:externals描述的策略不起作用.您对这种情况的体验是什么?没有必要使用一个结账.即使使用构建脚本或其他解决方案也会有所帮助.我正在寻找长期解决这个问题的方法,因为我们容易出错,因此不会在很大程度上取决于人类行为.

Eri*_*man 6

在Java世界中,我不会尝试仅使用版本控制系统来解决这个问题 - 我会使用像Maven +版本控制系统这样的依赖管理工具.

在我工作的地方,我们有一个看似很常见的设置:

任何"框架"项目都存在于它自己的目录结构(主干,标签,分支)中,就像您似乎已经拥有的那样.这些也使用Maven进行管理,每当签入某些内容时,组件的新版本(在大多数情况下是JAR文件)将发布到我们的本地Maven存储库(驻留在Nexus服务器上).

任何需要使用"框架"项目的项目都将依赖于特定版本的框架项目 - 然后Maven会在构建项目时自动从Nexus服务器中提取此版本.

这使我们能够分别释放每个项目和框架组件,但仍然跟踪它们之间的依赖关系.我们甚至可以拥有不同项目使用的多个版本的框架组件,而不会完全失去对依赖项的跟踪.

到目前为止,这对我们来说效果很好 - 我只能看到两个缺点:

设置需要一段时间,特别是如果您之前没有使用过Maven.

释放每个项目时会有一些开销,因为您还想释放每个依赖组件,以避免依赖于其他组件的"主干"版本(即Maven术语中的"SNAPSHOT"版本).