让我先解释我们的基础架构。使用Maven管理多个内部项目(从ant/ivy切换)
我公司生产两种企业软件产品(每种产品又包含多台服务器)。让我们叫他们ProductA
和ProductB
。
ProductA
由被支起来,但都是单独构建,并作为单个单元处理40个独立的项目。由于每个项目都会创建大型依赖关系树,因此我们使用Ivy/Ant来管理依赖关系。 TeamA正在不断修改所有这些项目,有时以不兼容的方式进行修改,因此我们将所有内容发布为常青藤(示例)1.0.0.SVN_REV
。当我们依赖某些东西时,我们会说1.0.0.+
并使用冲突解决程序来获得一组兼容的依赖关系。
想象一下,一个依赖关系图,如:
W -> X -> Y
\
-> Z
/
V
当我们的顶级项目取决于W 1.0.0.+
和V 1.0.0.+
,我们可能无法获得最新的V
作为最新W
可能尚未与最新Z
建成,所以常春藤驱逐最新的V
,取代1.0.0.9
而不是1.0.0.10
,因为最新的W
和V 1.0.0.9
都依赖于Z v1.0.0.6
所有这些版本都是由Bamboo驱动的,并且配置了依赖项来启动子版本的构建必要的,因此这些项目中的每一个都是分开构建的
所以,对于这种设置,常春藤保证所有我们的顶级依赖关系,是二进制兼容。现在,顶级构建可能需要最新的V
才能正确编译,所以会因编译错误而失败,但如果编译成功,我们就会知道所有依赖项都是二进制兼容的,并且QA不会花费时间当W
调用Z
时,安装8台服务器以找出某种方法丢失。
ProductB
利用了其中约30个这样的项目,但它并没有采取最新的措施,而是等待ProductA
的QA团队对发布进行认证,然后开始使用这些依赖关系。
其相当明显的Maven将如何为ProductB
工作,因为他们总是依赖于一个不变的依赖集。
所以,在评估Maven时,我看到SNAPSHOT
依赖关系和发布如何给我们提供基本结构。不过,我不知道或者不明白的是是否Maven的,发布W
时,它修改POM,以填补在已使用的明确的快照,或者它只是说,W
取决于X-1.0.0-SNAPSHOT
?
如果它不替换使用的确切X
,我怎么能得到相同的二进制兼容保证常春藤给我?
唯一的答案显然是采取一个巨大的建设,使所有40个项目,但是这将需要相当长的时间来建立,当顶级项目是唯一的变化。如果进行über编译需要30分钟,我可能会看到每个版本5-10次提交,这将很难评估哪个开发者破坏了构建。所以基本上,我正在寻找一个不同的解决方案,而不是这个。