在Gradle深度解释中,什么是常规构建?

Xel*_*ian 13 java convention declarative gradle

摇篮用户指南经常提到摇篮是声明和使用建立按约定.这是什么意思?

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

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

请告诉我更多正确理解这些概念.谢谢.

Pet*_*ser 12

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

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


Rob*_*lty 11

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

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

在命令式编程中,我们指定了如何完成某些任务.

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

然后Gradle利用插件提供处理诸如"Java Projects"或"Web Applications"之类的东西的构建服务.这很好,因为Gradle插件包含实现细节,这些细节涉及编译java类构建war文件等任务.

将此与另一个构建系统Make相比较,这在本质上更为迫切.让我们看一下从这里采取的简单的Make规则:

 foo.o : foo.c defs.h       
         cc -c -g foo.c
Run Code Online (Sandbox Code Playgroud)

所以在这里,我们看到一条规则描述了如何从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命令的标志.


Jef*_*rey 7

按惯例构建的想法是,如果遵循默认约定,那么构建将更加简单.因此,虽然您可以更改源目录,但不需要显式指定源目录.Gradle带有逻辑默认值.这也称为约定优于配置.

根据彼得的回答编辑本部分以更清楚地说明陈述性质:

构建是声明性的想法是您不需要指定需要完成的每个步骤.你没有说"做第1步,做第2步等".您可以定义需要应用的插件(或任务),然后使用gradle构建任务执行图并确定执行内容的顺序.