什么是 Gradle 深度解释中的约定俗成?

2022-09-04 06:55:11

Gradle 用户指南经常提到 Gradle 是声明性的,并且使用按约定构建。这是什么意思?

据我所知,这意味着,例如,在java插件中,有一些约定,例如source必须在,测试必须在,资源在,ready jars等。但是,Gradle 并不强制您使用这些约定,您可以根据需要更改它们。src/main/javasrc/main/testsrc/main/resourcesbuild/libs

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

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


答案 1

你对惯例构建的理解是正确的,所以我不必在那里添加任何东西。(另请参阅杰夫的答案。

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


答案 2

为了理解编程的声明式风格,将其与命令式编程风格进行比较和对比是很有用的。

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

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

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

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

将其与另一个构建系统Make进行对比,后者在本质上更加必要。让我们看一个简单的 Make 规则,从这里开始

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

因此,在这里,我们看到一个规则,描述了如何从C源文件和C头文件构建对象文件foo.o。

“生成”规则执行两项操作。

第一行说 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 命令的标志。