Project是什么?
每次Gradle构建必定由一个或多个project参与,Gradle的基本执行单元是task,而task则是在project中定义并维护的。
在一个简单的目录下新建一个build.gradle的文件,这个脚本在运行的时候就会定义一个project和一些task。比如在一个first_gradle目录下,新建一个空白的build.gradle,在控制台执行: gradle projects
> Task :projects
------------------------------------------------------------
Root project 'first_gradle'
------------------------------------------------------------
Root project 'first_gradle'
No sub-projects
To see a list of the tasks of a project, run gradle <project-path>:tasks
For example, try running gradle :tasks
可以一个root project,名称是当前的目录名称;一个简单的修改project名称的方式是在同级目录下新建一个settings.gradle文件,文件内容:
rootProject.name = "myProject"
再次执行gradle projects,可以看到这个project名称变成了myProject
# gradle projects
> Task :projects
------------------------------------------------------------
Root project 'myProject'
------------------------------------------------------------
Root project 'myProject'
No sub-projects
在build.gradle脚本中可以使用this指向当前的project,可以通过this访问当前project的属性,也可以省略this。
println "this:\"$this\""
println "-"*30
println tasks.each{it -> println it}
从输出结果可以看到已经定义了一部分task,之前在命令行执行的gradle projects其实也是执行其内建的task
this:"root project 'myProject'"
------------------------------
task ':buildEnvironment'
task ':components'
task ':dependencies'
task ':dependencyInsight'
task ':dependentComponents'
task ':help'
task ':init'
task ':javaToolchains'
task ':model'
task ':outgoingVariants'
task ':prepareKotlinBuildScriptModel'
task ':projects'
task ':properties'
task ':tasks'
task ':wrapper'
Project有什么?
标准的Project有很多属性和方法,除了标准的属性和方法,Gradle内建了很多插件也提供了各种各样适用不同场景的属性方法。
标准Project 属性
这里列举几个实用的标准属性,更多可以参考官网API
- ant: AntBuilder 实例,可以通过提供的API操作Ant Project
建立一个简单的ant配置build.xml,其内容如下:
Gradle提供了一部分API来通过ant实例来操作ant相关的对象,也可以通过ant自己的project来更加细致的进行配置或执行任务,比如:<?xml version="1.0"?> <project name="Hello World Project"> <target name="sayHello"> <echo>Hello World - Welcome to Apache Ant!</echo> </target> </project>
tasks.register("testAnt"){ doLast{ ant.importBuild(file("build.xml")) println ant.getProject().getName() println ant.getProject().getTargets() ant.getProject().executeTarget("sayHello") } }
Hello World Project [sayHello:sayHello] [ant:echo] Hello World - Welcome to Apache Ant!
- logger 用来打印日志的,可以通过它来打印不同级别的日志
logger.info("hello for info") logger.quiet("date:{}","2021-10-21")
- buildDir 项目生成的artifacts 都会在这里,默认projectDir/build
- group、name、version, 可以定位一个组件
- rootDir:项目的根目录
- tasks:TaskContainer的实例,也是创建任务比较重要的属性
标准Project 方法
这里也是列举几个常用的方法:
- allprojects(action),用来配置project和子project
- apply 方法,用来应用脚本或者插件
- artifacts(configureAction) 用来配置生成的组件
- configure方法,可以用来配置一组对象
- copy 方法
copy { from configurations.runtimeClasspath into 'build/deploy/lib' }
- defaultTasks 定义默认任务,当没有指定task的时候,默认任务将会执行
- delete 删除文件
tasks.register("deleteFile"){ doLast{ project.delete { logger.quiet("delete file") delete 'desc/test.txt' followSymlinks = true } } }
- exec 运行可执行程序
tasks.register("execCommand"){ doLast{ project.exec { executable "java" args "-version" } } }
或者# gradle execCommand > Task :execCommand java version "1.8.0_231" Java(TM) SE Runtime Environment (build 1.8.0_231-b11) Java HotSpot(TM) 64-Bit Server VM (build 25.231-b11, mixed mode)
tasks.register("execCommand"){ doLast{ project.exec{ commandLine("javac","-version") } } }
- file(path),获取指定路径的文件对象
- javaexec,可运行Java程序,指定classpath,mainClass等等
- mkdir 创建目录
- sync 同步文件,跟copy很像,但是在复制前会删除目标中的所有,除非指定preserve
- tarTree,根据指定路径创建TAR文件
- task,可以用来创建任务
- zipTree,根据指定路径创建 ZIP文件
Gradle标准的Project提供听丰富的方法,其外还可以通过引入插件来使用额外添加的更强大的方法。
标准Project的Script blocks
跟方法重复的一些不再介绍,这里也列举几个标准Project所具有的,其他插件添加到到后面在看:
- buildscript
当我们的构建脚本本身需要额外的组件的时候,可以通过它来添加第三方库import com.google.common.primitives.Ints import com.google.common.collect.Lists buildscript { repositories { maven { url "https://maven.aliyun.com/repository/central" } } dependencies { classpath group: 'com.google.guava', name: 'guava', version: '31.0.1-jre' } } tasks.register("testGuava"){ doLast { List<Integer> countUp = getNumberList() printNumbers(countUp) printNumbers(Lists.reverse(countUp)) } } List<Integer> getNumberList() { return Ints.asList(1, 2, 3, 4, 5); } void printNumbers(List<Integer> nums) { nums.forEach(t -> print t + "\t") println "" }
# gradle testGuava > Task :testGuava 1 2 3 4 5 5 4 3 2 1
- dependencies
项目构建的目标需要的依赖,具体到Java插件的时候再来了解 - repositories
定义所需组件的来源,具体到Java插件的时候再来了解
再来看下标准的Gradle提供的task, 其中没有用来编译打包用的task,后续需要通过插件来完成构建诸如构建Java 命令行程序,JavaEE项目等等
# gradle tasks --all
> Task :tasks
------------------------------------------------------------
Tasks runnable from root project 'test'
------------------------------------------------------------
Build Setup tasks
-----------------
init - Initializes a new Gradle build.
wrapper - Generates Gradle wrapper files.
Help tasks
----------
buildEnvironment - Displays all buildscript dependencies declared in root project 'test'.
dependencies - Displays all dependencies declared in root project 'test'.
dependencyInsight - Displays the insight into a specific dependency in root project 'test'.
help - Displays a help message.
javaToolchains - Displays the detected java toolchains.
outgoingVariants - Displays the outgoing variants of root project 'test'.
projects - Displays the sub-projects of root project 'test'.
properties - Displays the properties of root project 'test'.
tasks - Displays the tasks runnable from root project 'test'.
Other tasks
-----------
components - Displays the components produced by root project 'test'. [deprecated]
dependentComponents - Displays the dependent components of components in root project 'test'. [deprecated]
model - Displays the configuration model of root project 'test'. [deprecated]
prepareKotlinBuildScriptModel