命令式与声明式构建系统

Ank*_*gra 34 ant gradle maven

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

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

kos*_*tja 48

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

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

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

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

编辑: ant-maven比较的一个重要方面是maven有一个约定,描述文件应该位于何处,找到依赖关系的位置,放置生成的工件的位置,而ant则没有.

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

编辑2: '重塑轮子'的比喻似乎不如我所希望的那么清晰.这就是我的意思:

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

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

根据我的口味,Maven在权衡的另一边有点太过分了.更改默认值并不像应该的那样容易.