如何使用Ivy / Ant构建使用中间工件

时间:2011-11-13 13:12:05

标签: ivy

我正在尝试修改我的构建过程,以便在我的个人项目中使用带有apache常春藤的ant。它们由一些共享模块和一些依赖于共享模块的应用程序模块组成。为了这篇文章,让我们简化并说我有一个共享模块(common)和一个依赖application的应用程序模块(common)。每个模块都有自己的有效svn存储库:

svn_repo_1/common/trunk
                 /branches
                 /tags
svn_repo_2/application/trunk
                      /branches
                      /tags

我将相关版本检查到一个平面结构的公共工作区:

workspace/common
workspace/application

通常,application取决于已发布的common版本,因此在构建common时无需构建application

但是,当我需要向common添加application所需的新功能时,我希望application依赖于我的最新common版本工作区(无需发布我的存储库的公共内容)。

我认为这是latest.integration的含义(即更改application的ivy.xml以指定通用修订版的latest.integration)。我的目的是使用常春藤buildlist任务来查找在构建应用程序之前需要构建的本地模块。但这不起作用,因为buildlist任务似乎包含common / build.xml条目,无论应用程序的ivy.xml文件是否指定latest.integration或其他一些已发布的修订版。

我将不胜感激任何建议。我正在努力研究常春藤的文档和样本,所以任何真实的例子都会有所帮助。注意:我对Maven解决方案不感兴趣。

1 个答案:

答案 0 :(得分:1)

哇,这真的是似曾相识!从3 - 4个月前回到我在网站上的第一个问题,它们几乎都与常春藤相关!我100%同情你,常春藤是一个难以学习和驯服的野兽,但是在专业使用它几个月之后,如果没有它,我将永远不会发展。所以我的第一条建议是:继续。迟早,你在Apache Ivy上发现的那些小的(实用的)文档将会开始变得有意义并且起作用。

我可以理解,为什么您不想将common发布到您的回购邮件,可能会有一些情有可为的原因。但是,如果您是传递依赖关系管理的新手,我可以给您的第一条实用建议是总是将您的JAR / WARs /任何内容发布到您的仓库;不是工作区本地的中间“集成”。

原因很简单:Ivy只能抓取您在设置文件中定义的存储库(基本上)。如果您故意将common之类的JAR保留在其中一个定义的存储库之外,那么:(a)Ivy无法解决传递依赖关系(其主要工作),以及(b)“下游”(依赖)JAR每次调整common时都无法动态更新。因此,仅使用Ivy来发布JAR有点适得其反;我很惊讶常春藤甚至把它作为一个特色。

我想我需要了解你不发布common的动机。如果您只是在让ivy:publish任务工作时遇到问题,请不要担心我可以提供大量示例来帮助您入门。但如果还有其他原因,那么我请您考虑这个解决方案:设置多个存储库

也许您有一个“主要”存储库,其中大部分内容都已发布;然后你有一个“辅助”或“中间”存储库,只要有意义(为你)这样做就可以发布common。然后,您可以使用两个不同的发布任务配置Ant构建,例如 publish-main 发布集成

通过这种方式,你可以获得两全其美的效果:你可以获得中间临时区域,并且可以将所有内容保存在常春藤的强大控制之内。