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