首先让我解释一下我们的基础设施。
我公司生产两种企业软件产品(每种产品又包含多台服务器)。让我们称他们为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
构建{1}},所以Ivy驱逐最新的V
,取1.0.0.9
而不是1.0.0.10
,因为最新的W
和V 1.0.0.9
都取决于{{1}所有这些构建都是用Bamboo驱动的,依赖项配置为在必要时启动子构建,因此每个项目都是单独构建的。
因此,在此设置下,Ivy保证顶层构建的所有依赖项都是二进制兼容的。现在,顶级构建可能需要最新的Z v1.0.0.6
才能正确编译,因此会因编译错误而失败,但如果编译成功,我们就会知道所有依赖项都是二进制兼容的并且QA赢了当V
调用W
时,不会花时间安装8台服务器来查找某些方法。
Z
利用了大约30个这样的项目,但不是采用最新的项目,而是等待ProductB
的QA团队对发布进行认证,然后开始使用这些依赖项。
Maven如何适用于ProductA
,因为它们始终依赖于一组不变的依赖关系。
所以,来解决问题的关键,在评估Maven时,我看到ProductB
依赖关系和发布如何为我们提供基本结构。但是,我不知道或不了解的是,Maven在发布SNAPSHOT
时是否修改了POM,填写了所使用的显式SNAPSHOT,还是只说W
取决于在W
?
如果它不能替换使用的确切X-1.0.0-SNAPSHOT
,我怎样才能获得Ivy给我的相同二进制兼容保证?
唯一明显的答案是采用一个巨型构建来完成所有40个项目,但是当顶级项目是唯一的变化时,这需要相当长的时间来构建。如果是30分钟进行über编译,我可能会看到每个构建5-10次提交,这将使得很难评估哪个开发者破坏了构建。 基本上,我正在寻找与此不同的解决方案。
答案 0 :(得分:0)
当ivy发布到存储库时,可以选择指定发布版本
<ivy:publish resolver="shared" pubrevision="1.0" status="release">
<artifacts pattern="dist/[artifact].[ext]" />
</ivy:publish>
常春藤的好处在于它将生成并发布一个“ivy.xml”,它将在发布时解析所有动态版本号。所有这些你可能已经知道了。
令人惊讶的是,Maven需要更多的工作。你需要在本地编辑你的POM的插件(如果你有POM的子模块)。有关更多详细信息,请参阅以下插件
因此,在调用“mvn deploy”之前,您需要确保您的POM是犹太洁食。
老实说,我还没有完全放弃基于常春藤的构建,因为我发现很难模仿常春藤对动态模块相互依赖性的轻松支持。我确信这是可能的,就像我说过,当你习惯与常春藤一起工作时,它似乎更有效。
为了简化您从常春藤到Maven的过渡,您是否考虑过使用常春藤生成模块POM?以下对我来说非常有用:
<ivy:deliver deliverpattern="dist/ivy.xml" pubrevision="1.0" status="release"/>
<ivy:makepom ivyfile="dist/ivy.xml" pomfile="dist/pom.xml">
<mapping conf="default" scope="compile"/>
<mapping conf="runtime" scope="runtime"/>
</ivy:makepom>
deliver任务将解析所有动态依赖关系,并创建一个可用于生成maven POM的常春藤文件。然后,此POM将与模块标准工件一起发布,并且需要在常春藤文件中指定:
<ivy-module ..
..
<publications>
<artifact name="mymod" type="war" conf="master" />
<artifact name="pom" type="pom" ext="xml" conf="master" />
</publications>
确保您使用的是2.2.0版的常春藤,标准的常春藤发布任务(见上文)应该没有上传您的工件和生成的POM的问题