当前位置: 首页 > 教程 > Gradle >

Gradle任务

精华
小牛编辑
145浏览
2023-03-14

Gradle构建脚本描述一个或多个项目。每个项目都由不同的任务组成。任务是构建执行的一项工作。任务可以是编译一些类,将类文件存储到单独的目标文件夹中,创建JAR,生成Javadoc或将一些归档发布到存储库。

定义任务

任务是用于将任务定义到构建脚本中的关键字。看看下面的例子,它是一个叫作 hello 的任务,将打印一个字符串:hello world。将以下脚本复制并保存到 build.gradle 文件中。 此构建脚本定义一个名称为 “hello” 的任务,用于打印hello world字符串。

task hello {
   doLast {
      println 'hello world'
   }
}

在存储 build.gradle 文件的目录位置执行以下命令,应该看到输出结果如下 -

D:/worksp/yiibai.com/gradle-3.1/study/script>gradle -q hello
hello world

可以通过为 doLast 语句指定快捷方式(表示符号 <<)来简化此 hello 任务。如果添加这个快捷方式到上面的 hello 任务中,参考如下脚本。

task hello << {
   println 'hello world'
}

在存储 build.gradle 文件的目录位置执行以下命令,应该看到输出结果如下 -

D:/worksp/yiibai.com/gradle-3.1/study/script>gradle -q hello
hello world

任务依赖关系

您可能已经猜到,可以声明依赖于其他任务的任务。下面声明依赖于其他任务的任务,将以下代码复制并保存到build.gradle文件中。

task hello << {
    println 'Hello world!'
}
task intro(dependsOn: hello) << {
    println "I'm Gradle"
}

在存储 build.gradle 文件的目录位置执行以下命令,应该看到输出结果如下 -

D:/worksp/yiibai.com/gradle-3.1/study/script>gradle -q intro
Hello world!
I'm Gradle

要添加依赖关系,相应的任务不需要存在。懒依赖 - 其他任务不存在,将以下代码复制并保存到build.gradle文件中。

task taskX(dependsOn: 'taskY') << {
    println 'taskX'
}
task taskY << {
    println 'taskY'
}

在存储 build.gradle 文件的目录位置执行以下命令,应该看到输出结果如下 -

D:/worksp/yiibai.com/gradle-3.1/study/script>gradle -q taskX
taskY
taskX

定位任务

如果要查找在构建文件中定义的任务,则必须使用相应的标准项目属性。这意味着每个任务都可以作为项目的属性,使用任务名称作为属性名称。
看看下面的代码访问任务作为属性。将以下代码复制并保存到build.gradle文件中。

task hello

println hello.name
println project.hello.name

在存储 build.gradle 文件的目录位置执行以下命令,应该看到输出结果如下 -

D:/worksp/yiibai.com/gradle-3.1/study/script>gradle -q hello
hello
hello

您还可以通过任务集合使用所有属性。
将以下代码复制并保存到build.gradle文件中。

task hello

println tasks.hello.name
println tasks['hello'].name

在存储 build.gradle 文件的目录位置执行以下命令,应该看到输出结果如下 -

D:/worksp/yiibai.com/gradle-3.1/study/script>gradle -q hello
hello
hello

向任务添加依赖关系

要将一个任务依赖于另一个任务,这意味着当一个任务完成时,另一个任务将开始。 每个任务都使用任务名称进行区分。 任务名称集合由其任务集合引用。 要引用另一个项目中的任务,应该使用项目路径作为相应任务名称的前缀。
以下示例将从任务taskX添加依赖项到任务taskY

task taskX << {
   println 'taskX'
}
task taskY(dependsOn: 'taskX') << {
   println "taskY"
}

在存储 build.gradle 文件的目录位置执行以下命令,应该看到输出结果如下 -

D:/worksp/yiibai.com/gradle-3.1/study/script>gradle -q taskY
taskX
taskY

上面的例子是通过使用名字添加对任务的依赖。 还有另一种方法实现任务依赖性,即使用Task对象定义依赖性。
现在采用上面任务的相同示例,但是使用任务对象而不是任务参考名称来实现依懒关系。
将以下代码复制并保存到build.gradle文件中。

task taskY << {
   println 'taskY'
}
task taskX << {
   println 'taskX'
}
taskY.dependsOn taskX

在存储 build.gradle 文件的目录位置执行以下命令,应该看到输出结果如下 -

D:/worksp/yiibai.com/gradle-3.1/study/script>gradle -q taskY
taskX
taskY

还有另一种方法来添加任务依赖,它就是通过使用闭包。在这种情况下,任务通过闭包释放如果您在构建脚本中使用闭包,那么应该返回任务对象的单个任务或集合。以下示例将任务中从taskX添加依赖项到项目中的所有任务,其名称以“lib”开头。
将以下代码复制并保存到build.gradle文件中。

task taskX << {
   println 'taskX'
}

taskX.dependsOn {
   tasks.findAll { 
     task -> task.name.startsWith('lib') 
   }
}
task lib1 << {
   println 'lib1'
}
task lib2 << {
   println 'lib2'
}
task notALib << {
   println 'notALib'
}

在存储 build.gradle 文件的目录位置执行以下命令,应该看到输出结果如下 -

D:/worksp/yiibai.com/gradle-3.1/study/script>gradle -q taskX
lib1
lib2
taskX

向任务添加描述

可以向任务添加描述。 执行Gradle任务时会显示此描述。 这可以通过使用description关键字。
将以下代码复制并保存到build.gradle文件中。

task copy(type: Copy) {
   description 'Copies the resource directory to the target directory.'
   from 'resources'
   into 'target'
   include('**/*.txt', '**/*.xml', '**/*.properties')
   println("description applied")
}

在存储 build.gradle 文件的目录位置执行以下命令,应该看到输出结果如下 -

D:/worksp/yiibai.com/gradle-3.1/study/script>gradle -q taskX
description applied

跳过任务

如果用于跳过任务的逻辑不能用谓词表示,则可以使用StopExecutionException。 如果操作抛出此异常,则会跳过此操作的进一步执行以及此任务的任何后续操作的执行。 构建继续执行下一个任务。
将以下代码复制并保存到build.gradle文件中。

task compile << {
    println 'We are doing the compile.'
}

compile.doFirst {
    // Here you would put arbitrary conditions in real life.
    // But this is used in an integration test so we want defined behavior.
    if (true) { throw new StopExecutionException() }
}
task myTask(dependsOn: 'compile') << {
   println 'I am not affected'
}

在存储 build.gradle 文件的目录位置执行以下命令,应该看到输出结果如下 -

D:/worksp/yiibai.com/gradle-3.1/study/script>gradle -q myTask
I am not affected

Gradle在处理任务时有不同的阶段。 首先,有一个配置阶段,其中直接在任务的闭包中指定的代码被执行。 针对每个可用任务执行配置块,而不仅针对稍后实际执行的那些任务。

参考 -

  • https://docs.gradle.org/current/userguide/more_about_tasks.html
  • https://docs.gradle.org/current/userguide/tutorial_using_tasks.html