【问题标题】:What is build-by-convention in Gradle deep explanation?Gradle 深度解释中的按惯例构建是什么?
【发布时间】:2014-01-17 15:56:46
【问题描述】:

Gradle User Guide 经常提到 Gradle 是 声明式 并使用 build-by-convention。这是什么意思?

据我了解,这意味着,例如,在 java 插件中有如下约定 源必须在src/main/java,测试必须在src/main/test,资源在src/main/resources,准备好的罐子在build/libs等等。但是,Gradle 并不强制您使用这些约定,您可以根据需要更改它们。

但是对于第一个概念,我在理解上遇到了更大的问题。就像 SQL 一样,你说你想对查询做什么,但没有说数据库系统将如何获取它们,使用哪种算法来提取数据等。

请告诉我更多信息以正确理解这些概念。谢谢。

【问题讨论】:

  • 你的意思是你在理解 first 概念(声明性)方面有更大的问题?
  • 两者我都以一种方式理解,但我不知道这是正确的方式。

标签: java gradle conventions declarative


【解决方案1】:

您对按惯例构建的理解是正确的,所以我不必在那里添加任何内容。 (另见杰夫的回答。)

声明性背后的想法是,您不必在任务级别上工作,自己实现/声明/配置所有任务及其依赖项,而是可以在更高、更具声明性的级别上工作.你只需说“这是一个 Java 项目”(apply plugin: "java")、“这是我的二进制存储库”(repositories { ... })、“这是我的源代码”(sourceSets { ... })、“这些是我的依赖项”(@987654324 @)。根据这些声明性信息,Gradle 将确定需要哪些任务、它们的依赖关系以及需要如何配置它们。

【讨论】:

    【解决方案2】:

    为了了解declarative 的编程风格,将其与imperative programming 风格进行比较和对比会很有用。

    声明式编程允许我们指定我们想要完成的什么

    在命令式编程中,我们指定如何我们完成某事。

    所以当我们使用 gradle 时,正如 Peter 所描述的,我们会做出 声明,声明例如“这是一个 Java 项目”或“这是一个 Java Web 应用程序”

    然后,Gradle 使用插件来提供处理构建诸如“Java 项目”或“Web 应用程序”之类的东西的服务。这很好,因为 Gradle 插件包含与编译 java 类构建 war 文件 等任务相关的实现细节。

    将此与另一个构建系统 Make 进行对比,后者在本质上更具必要性。让我们看一下取自 here 的简单 Make 规则:

     foo.o : foo.c defs.h       
             cc -c -g foo.c
    

    所以在这里,我们看到一个描述如何从 C 源文件和 C 头文件构建目标文件 foo.o 的规则。

    Make 规则做了两件事。

    第一行说 foo.o 文件依赖于 foo.c 和 foo.h。就 Make 知道如何检查文件 foo.o 上的时间戳以查看它是否早于文件 foo.c 和 foo.h 而言,这一行是一种声明性的。如果 foo.o 较旧,则 Make 将调用下一行的命令。

    下一行是命令式。

    当 foo.o 文件比 foo.c 或 foo.h 中的任何一个文件更旧时,第二行指定确切地运行什么命令(cc - 一个 C 编译器)。另请注意,编写 Makefile 规则的人必须知道传递给 cc 命令的标志。

    【讨论】:

      【解决方案3】:

      按约定构建的理念是,如果您遵循默认约定,那么您的构建将会简单得多。因此,虽然您可以更改源目录,但您不需要明确指定源目录。 Gradle 带有逻辑默认值。这也称为约定优于配置

      根据彼得的回答,这部分经过编辑,更清楚地说明了声明性:

      声明式构建的想法是您不需要指定需要完成的每个步骤。您不会说“执行第 1 步,执行第 2 步等”。您定义需要应用的插件(或任务),然后 gradle 构建一个任务执行图并确定执行的顺序。

      【讨论】:

        猜你喜欢
        • 2015-08-29
        • 2018-01-09
        • 1970-01-01
        • 1970-01-01
        • 2015-03-30
        • 2014-01-27
        • 2011-10-23
        • 1970-01-01
        • 2022-08-23
        相关资源
        最近更新 更多