我正在考虑将我管理的Maven项目切换到Apache-Ant/Ivy。我需要对构建过程进行更多的控制,并且对Maven感到非常沮丧。请不要评论Maven有多棒。我的问题是关于艾薇的。
我想建立一个"标准的"Ant构建模板,以后可以在其他项目中使用,只需做最小的更改。
我将建立一个中央的"企业"库,在那里我们可以放置公共Maven库中不可用的第三方库(例如商业库、Sun库、专有库等)。这个企业存储库可以在我们的本地局域网中使用,但可能无法从办公室外使用。
每个开发人员将在~/.ivy/repository
中拥有一个私有存储库。我希望Ant构建可以使用企业存储库中库的更改版本自动更新此私有存储库。
在~/.ivy/ant
中,我计划使用Ant 1.8中的include
任务,将"标准"模块包含在单个项目build.xml
文件中。这些模块将为不同的Scala和Clojure版本(例如:scala-compile-2.9.1.xml
, clojure-compile-1.3.xml
等)提供Scala
和Clojure
编译目标等不同版本的东西。构建模块将在企业存储库中可用,如果它们发生变化,应该在私有存储库中自动更新。
每个项目将遵循一个标准的Maven目录结构:${project}/src/main/java
, ${project}/target/classes
等。
在过去,我尝试使用Ivy,但Ant构建文件非常大(> 500行模板构建文件),难以管理/编辑。我希望通过将标准目标放在~/.ivy/ant
目录中自己的构建模块中,我可以避免代码膨胀。
这能做到吗?我错了吗?我能找到的关于Ivy的唯一文档是在Apache网站上(http://ant.apache.org/ivy)。是否有其他可用的文档,包括书籍?
将模板构建文件划分为可包含的帮助文件是一个非常明智的想法。就我个人而言,现在我正在将一个非常大的项目从ant(完全没有依赖管理-只从ftp复制文件)切换到ant/ivy解决方案。所以我是这样做的——我有一个具有里程碑目标的文件——即准备编译、编译、准备存档、存档——等等。我想你明白了。我已经配置了所有这些目标的依赖关系(请不要误解我所说的依赖关系)。这样,编译依赖于准备编译,准备编译依赖于初始化,就像这样。这个目标没有主体——它们被包含在你的多模块项目的每个模块的每个构建文件中。这个目标的唯一目的是维护构建状态,因为这个导入的东西变得相当棘手,很难知道哪个目标被覆盖了,以及这个目标何时会运行。但是有了这个文件,我可以很容易地在每个合理的里程碑上改变vy构建的状态。我想在一个模块中编译帮助文件与exteran exe。没问题-在这个项目中我只是这样做-准备存档取决于编译帮助的目标。由于这些里程碑目标包括在内——我只能覆盖其中的一些——所有其他的都将保留构建项目的理想方式。
我的策略的另一部分-混合构建文件-为每个特定的区域。我有一份艾薇的档案。在那里我放了初始化,解析,发布等。当我想使用常春藤-我只是包括这个文件,并通过我的里程碑目标管理依赖关系。如果构建是典型的-我只包括这个文件,并具有约定优于配置的功能。都在盒子里。如何? ?只是与其他mixins结合。Mixins可以包含依赖于它们的其他Mixins。因此,每个mixin都是我构建策略的可重用部分。来自面向对象的东西——单一关注单元。在你的情况下,它是scala mixin与目标特定的scala的东西。
然后我有委派子项目共同构建活动的delegate.xml。我有dist,所有,测试和任何你想要的多模块项目。构建顺序使用抗常春藤任务构建列表进行评估。
还有其他一些文件-但这些是战略性的基本文件,它们帮助我在这个大而非常保守的项目中拥有一个可重用和可维护的构建。所以,如果你对细节感兴趣,不要害羞,联系我。我将非常乐意帮助你,因为常春藤文档真的很复杂和不完整。
编辑:关于书籍-行动中的蚂蚁可能会对你有所帮助,我从这本书中吸取了一些想法,我真的强烈推荐每个人都去读。在那里你也可以找到常春藤的东西。关于常春藤医生-抱歉,这是所有可用的。但当我遇到麻烦的麻烦,常春藤+蚂蚁-我发现一些有趣的文章在私人博客。所以…这可能会在某种程度上填补空白。