【问题标题】:Imperative vs Declarative build systems命令式与声明式构建系统
【发布时间】:2013-02-04 00:32:33
【问题描述】:

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

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

【问题讨论】:

    标签: maven ant gradle


    【解决方案1】:

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

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

    虽然 ant 为您提供了更大的灵活性,但它也迫使您不断地重新发明轮子。

    另一方面,Maven 需要较少的配置,但可能会感觉过于受限,尤其是当您习惯于不同的工作流程时。

    编辑: ant-maven 比较的一个重要方面是 maven 有一个约定,描述文件应该放在哪里,在哪里找到依赖项,在哪里放置生成的工件,而 ant 没有。

    因此,您可以将使用 maven 想象成乘坐公共汽车 - 您选择您进入的站点和离开的站点。使用 ant 就像开车一样——你必须自己动手。您不必告诉巴士司机该做什么,但停靠站可能离您想去的地方太远。

    EDIT2:“重新发明轮子”的比喻似乎没有我希望的那么清晰。这就是我的意思:

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

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

    Maven 在权衡的另一边对我来说有点过分了。更改默认值并不像它可以而且应该那样容易。

    【讨论】:

    • 虽然我没有在 Ant 上工作过,但是类似的事情应该已经解决了对吧?就像 Ant 中的某种插件在更多项目中一样?
    • @AnkitDhingra 恐怕 ant 的流行做法是复制粘贴上次有效的设置 :) 当然有最佳做法,但您仍然必须实施它们。请查看编辑
    • @AnkitDhingra 好吧,这不像是重新发明轮子,你是对的,而是重建它。
    • Ant 是如何逼你“重新发明轮子”的?你到底在重塑什么?
    • @Gili 我已经尽量表达清楚了,请看编辑。
    猜你喜欢
    • 2019-05-29
    • 2021-07-03
    • 1970-01-01
    • 1970-01-01
    • 2022-07-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-11
    相关资源
    最近更新 更多