你在复杂的构建过程中使用了什么?

我正在尝试改进我们的构建过程,这是一个巨大的Ant build.xml,它调用其他ant构建文件并执行几个Java类来执行更复杂的逻辑,这些逻辑在Ant中是不可能的/可怕的。

背景:

  • Java和Ant的经验,一些Groovy
  • Windows平台

目标:

  • 作为命令行cron和servlet发布时的组合运行
  • 尽可能简化,最少的语言和技术之间的弹跳

我需要像Java这样的语言提供更高级别的逻辑能力,而Ant非常简单,我们使用过滤来覆盖不同客户端的默认属性文件。 大多数情况下,我想知道人们使用的是Ant / Java以外的东西。

除了你提到的Ant和疤痕制造/ autotools,主流工具是:

  • 使用SCons
  • 果酱
  • CMake的
  • Maven的

我使用SCons,因为它基于python,资金充足且优雅。 Jam似乎是最实用的一个。 我不太了解CMake。 Maven可能是您的选择,因为它以Java为中心,比Ant更高级。

您可以在维基百科找到更多内容: 内置工具列表

如果你追求Maven,那么你将遇到两个问题:复杂的构建和学习Maven的f @ * #ing“魔法”。 Maven只会使问题变得更糟,因为它是钝的,过于复杂。

我在一家大型财富500强公司inheritance了传统的Maven 1.x版本。 近年来,我在许多其他项目中选择使用Maven 2.x. 我对Maestro进行了评估,希望它可以使Maven易于处理。 我和许多其他人一样(检查“网”)的结论是,Maven是向错误方向迈出的一大步。 它绝对不是Ant的改进。

我已经使用Ant多年了,包括编写一个大型的Ant帮助脚本开源库。 我也广泛使用它的.NET表兄nAnt。 但是,Ant有两个主要的缺点。 其一,XML根本不是做构建任务的正确位置。 二,Ant和XML不能很好地扩展到大型复杂的构建。 事实上,我在这里写了很多关于我在那个舞台上(和Maven)的经历。

行业领导者已经得出结论,构建只是另一个应用程序,应该使用通用应用程序工具来处理。 但是,由于它涉及系统级和跨平台function,因此大多数开发语言/平台都不适合(包括Java,因此包括Ant和Maven)。 这也排除了.NET。

我花了两年时间寻找替代品,我发现它:Python。 它具有系统级访问,跨平台可移植性,简单性,可读性,function,稳健性和成熟度的正确组合。 SCons,buildbot,setuptools / easyinstall和基础Python是我目前构建过程的目标平台。 必要时,与Ant,Maven和任何其他此类工具的集成很容易。 同时,我可以将这些工具用于任何具有任何源语言的平台上的任何构建的核心。 没有更多的障碍,没有更多疯狂的复杂性,没有更多据说有用的“声明性”脚本,没有更多的黑盒f @ * #ing“魔术”。

如果你不能切换到Python,那么试试Ant + Ivy(在apache.org)。 它为您提供了Maven的酷存储库,而没有Maven的大部分邪恶。 这也是我在做的,必要和适当的。

最好的祝愿。

另外看看

  • 甘特
  • 摇篮

虽然像SCons这样的更通用的构建系统非常强大,但与专门为构建Java项目而定制的系统相比,Java支持有些限制。

我喜欢使用Rake,因为你可以依赖整个Ruby语言的强大function,并在需要时使用它的框架库。

我使用Ant,利用它的宏function 。 如果以一致的方式布局项目,则可以通过编写宏来消除大量重复。

我一直在构建一个包含宏和自定义任务的Antlib ,我在多个项目中重用这些任务。

或者,有些人发誓Maven。 其他人只是发誓Maven。

我使用Maven,不只是用于构建,我还使用他们的release / dist插件。

在一对命令中,我可以使用源代码控制中的代码来构建,打包和发布。

发布插件处理更新版本号,dist处理如何将所有内容放在一起并压缩它。

与Maven相比,Ant看起来很难看。 当然,Maven有一个学习曲线,但是阅读pom.xml比阅读build.xml要容易得多。

Maven需要更加冗长。

我喜欢Ant,但前提是你花时间编写自己的Java插件来封装复杂的动作。 这并不难,但不幸的是大多数人都试图用ant-contrib的东西用XML编写逻辑。 我认为这是一个巨大的错误。

我听说过关于rake和groovy工具的好东西(在另一条评论中提到),但我没有经验。

如果你想在一个生命周期中编写几个步骤,你可能最好使用基于流程自动化的构建服务器,如AnthillPro(Cruise,BuildForge和Electric-Commander是这个领域的其他人)。

另一个提出这类问题的地方是CITCON邮件列表 。 CITCON是一个关于持续集成和测试的会议,相关的邮件列表已成为围绕这些主题的真正优秀的社区。

(我是CITCON的组织者,但是爱的劳动力不是利润的制造者。它确实有一个真正有用的邮件列表。如果我是拉皮条钱的话,那就是The CI Guys 。;-))

因为你正在构建Java,所以坚持使用Ant。 我已经为一些JNI工作混合了Ant / SCons,但总的来说我会留在Ant,特别是因为你在Ant中有一个现有的构建设置。 移植到Maven就像在一个没有孔的墙上推一个方形钉。

拥抱您的自定义Java逻辑,并考虑编写适当的Ant任务,而不是执行外部Java代码。 我通过简单地扩展Ant来完成我所需要的,解决了构建过程中一些非常复杂的部分,例如。 管理大型gui项目的图标资源或直接注入subversion信息信息jar清单(谢谢SVNKit)

一周中的任何一天我都会和Ant一起去。

它并不完美; XML非常冗长,实现任何逻辑几乎都是不可能的,但即使是团队中最初级的工程师也至少可以理解ant文件在一天内所做的事情。

如果您愿意,可以使用java重构复杂逻辑并将其集成到ant中。 Ant为您提供java的所有function:)

无论您使用何种系统,依赖性解析都很困难。 使用ant,最好的解决方案似乎是存储所有jar的lib目录,或者是在构建时从中复制库的内部Web服务器。

我也有Maven 1和Maven 2的一些经验。这种经历让我觉得Maven对于业余爱好项目很棒,但是随着时间的推移,你可能会遇到软件的复杂问题。

我看到Maven有两个重要问题:

  • 使用Maven导入的任何依赖项可能会在您不知情的情况下随时间发生变化,从而导致出现奇怪的问题。
  • 您不仅导入使用Maven直接导入的软件的许可证,还导入间接导入的库使用的许可证

简而言之,我不喜欢构建取决于它开始的时间这一事实。 在生产发布一年后生成错误修复版本时,这可能是一个真正的问题。

当然可以管理这些问题(可能使用nexus代理),但在重建构建系统之前需要考虑它们。 在我的公司,我们决定将Ant用于所有新项目,并尝试在任何场合出现时将maven 1和2移植到ant。 让它保持工作太难了。

我的建议是,如果您和您的团队知道如何处理ant,请尝试重构您的ant文件,不要跳过其他构建工具。 它只需要太多时间就能做到; 时间你可以花钱赚钱和公司生存:)

我到处都可以使用Rake。 你需要构建java代码的地方,你可以在jruby中使用它,或者看看像buildr这样的东西

我们使用luntbuild。 这是一个非常容易使用的网络应用程序。 它将从CVS / SVN签出,自动增加版本/内部版本号,在ant脚本中执行构建任务,并使用新版本标记您的存储库。 可以安排自动构建,让它通过电子邮件发送给您或通过IM与您联系,还具有安全性和构建依赖性。

我们仍在使用1.2.3版,但我发现它高达1.6.0。 它只是有效。

http://luntbuild.javaforge.com/

编辑:重新阅读你的问题我现在看到你正在寻找替代Ant的东西。 在我们的例子中,Ant并不是一个真正的问题。 我们在Netbeans中设置了项目,它使用Ant进行构建,我们只需要在Netbeans提供的现有脚本中实现一些钩子,这很容易做到。

编辑:看起来你可以从Groovy调用Ant。 这样会很好,因为这样你就可以重用Ant已经存在的所有任务。

http://groovy.codehaus.org/Using+Ant+from+Groovy

试试FinalBuilder

它为您的构建过程提供了一个GUI界面,并且几乎可以为所有内容提供本机操作,还有一个可以创建自己的动作工作室。

有一点规划可以非常精简。

我必须添加这些解决方案,我发现我不能没有……它叫做Hudson 。 设置只需几秒钟,您通常可以使用现有ANT文件的大部分内容。

此外,Hudson提供了一种很好的方式来“cron”构建,执行测试用例,并以任何人都可以下载的方式生成“工件”(例如构建产品)。

它很难捕捉到它能为你做的一切……所以试试吧……你不会失望的。

Maven是做大型构建的不错选择……在大多数情况下,它不起作用非常简单。 人们误解了Maven的概念。 如果您正在使用“maven方式”,那么最终将使用更小的模块,从而为您的软件提供更好的架构。 另一方面,像Hudson这样的东西会通过使用Maven来减少构建时间,因为Hudson支持只构建任何其他构建工具不支持的已更改模块。 Maven的问题是学习和理解Maven的概念,例如项目的结构(文件夹等)或只有一个工件等。构建周期将在不同的领域为您提供支持:编译,打包,部署和发布这是其他工具不支持的(只有你手工实现它…我已经编写了许多大型Ant脚本来达到这个目标)……其他问题如时间的变化是由忽略最佳实践和引脚指向引起的使用的版本。

我主要使用Ant,但Maven也是一个很好的工具。 有了ant,你可以做任何你想做的事。

在我们公司,我们创建了一个通用的ant构建器,它可以完成很多工作:构建,压缩图像,缩小,生成文档,打包文件。它是开源的,我们乐于改进。 你可以在这里得到它:

https://github.com/edertone/TurboBuilder