例子 1. 第一个构建脚本, 在 Android 项目中找到 build.gradle, 在里面添加以下代码:
- // build.gradle
- task hello {
- doLast {
- println 'Hello world!'
- }
- }
在项目的移至包含的目录并使用以下命令执行构建脚本:
- ./gradlew -q hello // Android 用户在根目录使用 ./gradlew
- gradle -q hello // 非 Android 用户使用 gradle
使用 - q 命令行选项运行. 这将取消 Gradle 的日志消息, 因此仅显示任务的输出. 这样可以使示例输出更加清晰. 如果不想, 则不需要使用此选项.
后面直接将执行构建脚本的命令放在注释前, 不在单行作为展示了.
定义任务
在这里, 你将看到了如何使用字符串作为任务名称来定义任务. 此样式有一些变体, 您可能需要在某些情况下使用.
- task('hello') {
- doLast {
- println "hello"
- }
- }
- task('copy', type: Copy) {
- from(file('srcDir'))
- into(buildDir)
- }
上面创建了两个任务分别是 hello 和 copy. 有一种定义任务的替代语法, 您可能更喜欢使用:
- tasks.create('hello') {
- doLast {
- println "hello"
- }
- }
- tasks.create('copy', Copy) {
- from(file('srcDir'))
- into(buildDir)
- }
上面同样创建了两个任务分别是 hello 和 copy. 最后, Groovy 和 Kotlin DSL 有特定于语言的语法:
- // Using Groovy dynamic keywords
- task(hello) {
- doLast {
- println "hello"
- }
- }
- task(copy, type: Copy) {
- from(file('srcDir'))
- into(buildDir)
- }
采用代码构建脚本
Gradle 的构建脚本为您提供了 Groovy 和 Kotlin 的全部功能. 作为一个开胃菜, 看看这个: 在 Gradle 的任务中使用 Groovy 或 Kotlin :
- // gradle -q upper
- task upper {
- doLast {
- String someString = 'mY_nAmE'
- println "Original: $someString"
- println "Upper case: ${someString.toUpperCase()}"
- }
- }
- // gradle -q count
- task count {
- doLast {
- 4.times { print "$it" }
- }
- }
任务之间的依赖
任务之间可以具有依赖性, 关键字 dependsOn :
- // gradle -q intro
- task hello {
- doLast {
- println 'Hello world!'
- }
- }
- task intro {
- dependsOn hello
- doLast {
- println "I'm Gradle"
- }
- }
上面的依赖是依赖的任务先声明, 然后再进行依赖, 还有一种依赖是懒惰性依赖, 被依赖的任务可以后面再声明, 但是如果不声明的会报错:
- // gradle -q taskX
- task taskX {
- dependsOn 'taskY'
- doLast {
- println 'taskX'
- }
- }
- task taskY {
- doLast {
- println 'taskY'
- }
- }
任务 taskX 依赖的任务 taskY 是后声明的.
您可以通过多种方式定义任务的依赖关系. 在 "任务依赖项" 中, 介绍了使用任务名称定义依赖项. 任务名称可以引用与该任务在同一项目中的任务, 也可以引用其他项目中的任务. 要引用另一个项目中的任务, 请在任务名称前添加其所属项目的路径. 以下是添加从 projectA:taskX 到的依赖的示例 projectB:taskY:
- // gradle -q taskX
- project('projectA') {
- task taskX {
- dependsOn ':projectB:taskY'
- doLast {
- println 'taskX'
- }
- }
- }
- project('projectB') {
- task taskY {
- doLast {
- println 'taskY'
- }
- }
- }
此处的 projectA,projectB 要改成你项目中的名字, 简单来说, 就是不同层级的任务也是可以相互依赖的.
动态任务
Groovy 或 Kotlin 的功能可用于定义任务以外的其他功能. 例如, 您也可以使用它来动态创建任务.
- // gradle -q task1
- 4.times { counter ->
- task "task$counter" {
- doLast {
- println "I'm task number $counter"
- }
- }
- }
上述创建了 4 个 task, 分别是 task0,task1,task2,task3.
操作已创建的任务
任务创建后, 就可以通过 API 对其进行访问. 例如, 您可以在运行时为任务动态添加依赖项.
- // gradle -q task0
- 4.times { counter ->
- task "task$counter" {
- doLast {
- println "I'm task number $counter"
- }
- }
- }
- task0.dependsOn task2, task3
或者, 您可以将行为添加到现有任务.
- // gradle -q hello
- task hello {
- doLast {
- println 'Hello Earth'
- }
- }
- hello.doFirst {
- println 'Hello Venus'
- }
- hello.configure {
- doLast {
- println 'Hello Mars'
- }
- }
- hello.configure {
- doLast {
- println 'Hello Jupiter'
- }
- }
调用 doFirst 和 doLast 可以执行多次. 他们将操作添加到任务操作列表的开头或结尾. 执行任务时, 将按顺序执行操作列表中的操作.
Groovy DSL 快捷方式符号
访问现有任务有一种方便的表示法. 每个任务都可以作为构建脚本的属性来使用:
- // gradle -q hello
- task hello {
- doLast {
- println 'Hello world!'
- }
- }
- hello.doLast {
- println "Greetings from the $hello.name task."
- }
例子中, 通过获取任务的名字可以知道这个是来自于 task hello 的任务所做的事. 这样可以提高代码的可读性, 尤其是在使用插件提供的任务 (例如 compile 任务) 时.
额外任务属性
您可以将自己的属性添加到任务上. 要添加名为的属性 myProperty, 并为 ext.myProperty 设置初始值. 就可以像预定义的任务属性一样读取和设置属性.
- // gradle -q printTaskProperties
- task myTask {
- ext.myProperty = "myValue"
- }
- task printTaskProperties {
- doLast {
- println myTask.myProperty
- }
- }
默认任务
如果未指定其他任务, 则 Gradle 允许您定义一个或多个默认任务.
- // gradle -q
- defaultTasks 'clean', 'run'
- task clean {
- doLast {
- println 'Default Cleaning!'
- }
- }
- task run {
- doLast {
- println 'Default Running!'
- }
- }
- task other {
- doLast {
- println "I'm not a default task!"
- }
- }
这等效于运行 gradle clean run. 在多项目构建中, 每个子项目都可以有其自己的特定默认任务. 如果子项目未指定默认任务, 则使用父项目的默认任务(如果已定义)
通过 DAG 进行配置
正如我们稍后将详细描述的(请参阅 Build Lifecycle),Gradle 具有配置阶段和执行阶段. 在配置阶段之后, Gradle 知道应该执行的所有任务. Gradle 为您提供了一个利用此信息的机会. 一个用例是检查发布任务是否在要执行的任务中. 以此为基础, 您可以为某些变量分配不同的值.
在以下示例中, distribution 和 release 任务的执行导致 version 变量的值不同.
- // gradle -q distribution
- // gradle -q release
- task distribution {
- doLast {
- println "We build the zip with version=$version"
- }
- }
- task release {
- dependsOn 'distribution'
- doLast {
- println 'We release now'
- }
- }
- gradle.taskGraph.whenReady { taskGraph ->
- if (taskGraph.hasTask(":release")) {
- version = '1.0'
- } else {
- version = '1.0-SNAPSHOT'
- }
- }
可以发现, 此处, 执行不同的 task 具有不同结果.
构建脚本的外部依赖关系
如果构建脚本需要使用外部库, 则可以将它们添加到构建脚本本身中的脚本的类路径中. 您可以使用 buildscript() 方法执行此操作, 并传入一个声明构建脚本类路径的块.
- buildscript {
- repositories {
- mavenCentral()
- }
- dependencies {
- classpath group: 'commons-codec', name: 'commons-codec', version: '1.2'
- }
- }
buildscript()方法中的代码块将构成 ScriptHandler 实例. 您可以通过向 classpath 配置添加依赖项来声明构建脚本类路径. 这与您声明 Java 编译类路径的方式相同. 您可以使用除项目依赖项以外的任何依赖项类型.
声明了构建脚本类路径后, 就可以像在该类路径上的任何其他类一样使用构建脚本中的类. 以下示例将添加到前面的示例中, 并使用构建脚本类路径中的类.
- // gradle -q encode
- import org.apache.commons.codec.binary.Base64
- buildscript {
- repositories {
- mavenCentral()
- }
- dependencies {
- classpath group: 'commons-codec', name: 'commons-codec', version: '1.2'
- }
- }
- task encode {
- doLast {
- def byte[] encodedString = new Base64().encode('hello world\n'.getBytes())
- println new String(encodedString)
- }
- }
这里先是添加了依赖项, 然后再创建了一个任务, 引用了依赖项中的类来实现对字符串的加密.
访问任务的属性
您通常需要找到在构建文件中定义的任务, 例如, 对其进行配置或将其用于依赖项. 有很多方法可以做到这一点. 首先, 就像定义任务一样, Groovy 和 Kotlin DSL 具有特定于语言的语法
- task hello
- task copy(type: Copy)
- // Access tasks using Groovy dynamic properties on Project
- println hello.name
- println project.hello.name
- println copy.destinationDir
- println project.copy.destinationDir
任务也可以通过 tasks 集合获得.
- task hello
- task copy(type: Copy)
- println tasks.hello.name
- println tasks.named('hello').get().name
- println tasks.copy.destinationDir
- println tasks.named('copy').get().destinationDir
您可以使用 tasks.getByPath() 方法使用任务的路径从任何项目访问任务. 您可以 getByPath() 使用任务名称, 相对路径或绝对路径来调用该方法.
- project(':projectA') {
- task hello
- }
- task hello
- println tasks.getByPath('hello').path
- println tasks.getByPath(':hello').path
- println tasks.getByPath('projectA:hello').path
- println tasks.getByPath(':projectA:hello').path
来源: https://www.cnblogs.com/huansky/p/12064630.html