我正在尝试找到解决以下问题的可行策略。
我们有几个依赖于我们框架的Web项目。一切都存储在我们的SVN中,并拥有自己的项目,其中包含所有必要的目录结构(主干,标签,分支)。在一个示例中-我们有项目webprj01和webprj02,我们有一个框架frm01。所有这些都具有通常的SVN项目结构-中继线,标签,分支。
webprj01和webprj01都依赖于frm01,在现实生活中,frm01作为webprj01和webprj02的子目录存在。为了在SVN中实现此目的,可以设置svn:external属性,我们可以将frm01设置为指向webprj01和webprj02的主干内的/frm01/trunk。
要进行真实的编码,我们必须将所有三个项目都 check out 为工作副本,并在其自己的工作副本中对特定代码库进行更改。没有办法将更改从webprj01/frm01发布到SVN。更改需要在frm01工作副本中完成,并通过SVN转移到webprj01/frm01和webprj02/frm01工作副本中。
此解决方案在分支时存在依赖项问题。我从SVN/webprj01/trunk到/webprj01/branches/release-1.0.0创建了生产分支。在进行第二个项目webprj02和frm01的两天中,我不再能够通过分支release-1.0.0中的svn:externals进行稳定的 checkout 。目录frm01已经指向frm01/trunk的新更改。
描述的只是问题的简化版本。在我们的现实生活中,依赖性有时会深入到五个层次。我希望能够随时从SVN获得稳定的代码。用不同的话说。当我将webprj01分支/标记为release-1.0.0时。我想在创建后的一年内为该特定标签获得稳定的代码。
显然,使用svn:externals描述的策略无法完成工作。您对这种情况有何经验?不必使用一个结帐。即使使用构建脚本或其他解决方案,也会在这里有所帮助。我正在寻找一个长期解决该问题的方法,因为我们容易犯错误,因此该问题不会在很大程度上取决于人类的行为。
最佳答案
在Java世界中,我不会尝试仅使用版本控制系统来解决此问题-我会使用诸如Maven和版本控制系统之类的依赖项管理工具。
在我工作的地方,我们有一个看起来很普通的设置:
任何“框架”项目都像您已经拥有的那样,都存在于其自己的目录结构(主干,标签,分支)中。还可以使用Maven来管理这些文件,并且只要 checkin 内容,就会将新版本的组件(在大多数情况下为JAR文件)发布到我们本地的Maven存储库(位于Nexus服务器上)。
任何需要使用“框架”项目的项目都将依赖于框架项目的特定版本-每当构建项目时,Maven都会自动从Nexus服务器中提取该版本。
这使我们可以分别发布每个项目和框架组件,但仍可以跟踪它们之间的依赖关系。我们甚至可以拥有不同项目使用的框架组件的多个版本,而不会完全失去对依赖项的跟踪。
到目前为止,这对我们来说效果很好-我只能看到两个缺点:
设置会花费一些时间,尤其是如果您以前没有使用过Maven的话。
发布每个项目时会产生一些开销,因为您也要发布每个从属组件,以避免对其他组件的“主干”版本(即,Maven术语中的“SNAPSHOT”版本)具有依赖关系。
关于svn - 颠覆和依赖,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3248348/