命令式与声明式构建系统

时间:2013-02-19 10:50:25

标签: maven ant gradle

我最近开始使用Gradle作为构建系统。 他们首先将Gradle与Ant和Maven等人的比较是, Ant是 命令式 构建系统,而Maven是 声明式 构建系统。 虽然Gradle是一个声明性构建系统,但没有Maven强制执行的强制性。

在谈论构建系统时,我想更好地理解这些术语声明性命令式

1 个答案:

答案 0 :(得分:45)

简而言之,一个蚂蚁脚本告诉蚂蚁工具该做什么 - “编译这些文件,然后将它们复制到该文件夹​​。然后获取该文件夹的内容并创建一个存档。” / p>

虽然maven pom声明了我们想要的结果 - “这里是项目所依赖的库的名称,我们希望生成一个网络存档”。 Maven知道如何获取库以及在哪里找到它自己的源类。

虽然蚂蚁给你更大的灵活性,但它也会迫使你不断重新发明轮子。

另一方面,Maven需要较少的配置,但可能会受到太多约束,特别是如果您习惯于不同的工作流程。

编辑: ant-maven比较的一个重要方面是,maven有一个约定,描述文件应该位于何处,找到依赖关系的位置,在哪里把所产生的神器,而蚂蚁没有。

所以你可以想到使用maven就像乘坐公共汽车一样 - 你选择了你进入的站点和你离开的站点。使用蚂蚁就像开车一样 - 你必须自己动手。你不必告诉公交车司机该做什么,但停靠点可能离你想去的地方太远了。

EDIT2:'重新发明轮'的比喻似乎不像我希望的那么清晰。这就是我的意思:

如果没有合理的默认值/约定,您必须为每个项目明确定义项目结构和构建生命周期,这通常使其成为品味和意见的问题。由于团队和公司之间的偏好不同,因此构建流程也是如此。这需要为新项目成员和后来的维护者进行更多的认知工作。根据开发人员的经验和专业知识,最终解决方案可能难以扩展和使用。

正如我在下面的评论中所说的那样,虽然存在针对ant构建的最佳实践,但它们仍然必须针对每个项目实施,或者从项目复制粘贴到项目,而不是成为现成的默认构建工具本身。

对于我的口味,Maven在权衡的另一方面有点太过分了。更改默认值并不像应该的那样容易。