【发布时间】:2013-02-04 00:32:33
【问题描述】:
我最近开始使用 Gradle 作为构建系统。 Gradle 与 Ant 和 Maven 之类的第一个比较是, Ant 是一个命令式 构建系统,而 Maven 是一个声明式 构建系统。 虽然 Gradle 是一个声明式构建系统,但没有 Maven 强制执行的刚性。
在谈论构建系统时,我想更好地理解这些术语声明性和命令性。
【问题讨论】:
我最近开始使用 Gradle 作为构建系统。 Gradle 与 Ant 和 Maven 之类的第一个比较是, Ant 是一个命令式 构建系统,而 Maven 是一个声明式 构建系统。 虽然 Gradle 是一个声明式构建系统,但没有 Maven 强制执行的刚性。
在谈论构建系统时,我想更好地理解这些术语声明性和命令性。
【问题讨论】:
简而言之,一个 ant 脚本告诉 ant 工具该做什么 - “编译这些文件,然后将它们复制到该文件夹。然后获取该文件夹的内容并创建一个存档。”
当一个 maven pom 声明 我们想要的结果 - “这里是项目所依赖的库的名称,我们想要生成一个网络存档” . Maven 知道如何获取库以及在哪里找到它自己的源类。
虽然 ant 为您提供了更大的灵活性,但它也迫使您不断地重新发明轮子。
另一方面,Maven 需要较少的配置,但可能会感觉过于受限,尤其是当您习惯于不同的工作流程时。
编辑: ant-maven 比较的一个重要方面是 maven 有一个约定,描述文件应该放在哪里,在哪里找到依赖项,在哪里放置生成的工件,而 ant 没有。
因此,您可以将使用 maven 想象成乘坐公共汽车 - 您选择您进入的站点和离开的站点。使用 ant 就像开车一样——你必须自己动手。您不必告诉巴士司机该做什么,但停靠站可能离您想去的地方太远。
EDIT2:“重新发明轮子”的比喻似乎没有我希望的那么清晰。这就是我的意思:
如果没有合理的默认值/约定,您必须为每个项目明确定义项目结构和构建生命周期,这通常取决于品味和意见。由于团队和公司之间的偏好不同,因此构建流程也是如此。这需要新项目成员和后来的维护者付出更多的认知努力。根据开发人员的经验和专业知识,最终的解决方案可能难以扩展和使用。
正如我在下面的评论中所说,虽然存在 ant 构建的最佳实践,但它们仍然必须为每个项目实施,或者从一个项目复制粘贴到另一个项目,而不是成为开箱即用的默认设置构建工具本身。
Maven 在权衡的另一边对我来说有点过分了。更改默认值并不像它可以而且应该那样容易。
【讨论】: