生命周期任务对于区分用户或机器(CI 与本地)之间的工作特别有用。例如,本地机器上的开发人员可能不希望在每次更改时都运行整个构建。
让我们以一个应用了 base 插件的标准 app 为例。
Gradle base 插件定义了几个生命周期任务,包括 build、assemble 和 check。
我们通过向 app 构建脚本添加以下几行来将 build、check 任务和 run 任务分组
app/build.gradle.kts
tasks.build {
group = myBuildGroup
}
tasks.check {
group = myBuildGroup
description = "Runs checks (including tests)."
}
tasks.named("run") {
group = myBuildGroup
}
app/build.gradle
tasks.build {
group = myBuildGroup
}
tasks.check {
group = myBuildGroup
description = "Runs checks (including tests)."
}
tasks.named('run') {
group = myBuildGroup
}
如果我们现在查看 app:tasks 列表,我们可以看到这三个任务都可用
$ ./gradlew :app:tasks
> Task :app:tasks
------------------------------------------------------------
Tasks runnable from project ':app'
------------------------------------------------------------
My app build tasks
------------------
build - Assembles and tests this project.
check - Runs checks (including tests).
run - Runs this project as a JVM application
tasksAll - Show additional tasks.
如果标准生命周期任务足够,这已经很有用了。移动组有助于澄清您希望在构建中使用的任务。
在许多情况下,您需要解决更具体的要求。一个常见的场景是在不运行测试的情况下运行质量检查。目前,:check 任务运行测试和代码质量检查。相反,我们希望一直运行代码质量检查,但不运行耗时的测试。
为了添加一个质量检查生命周期任务,我们引入了一个名为 qualityCheck 的额外生命周期任务和一个名为 spotbugs 的插件。
要添加生命周期任务,请使用 tasks.register()。您只需要提供一个名称。将此任务放入我们的组中,并使用 dependsOn() 方法连接属于此新生命周期任务的可操作任务
app/build.gradle.kts
plugins {
id("com.github.spotbugs") version "6.0.7" // spotbugs plugin
}
tasks.register("qualityCheck") { // qualityCheck task
group = myBuildGroup // group
description = "Runs checks (excluding tests)." // description
dependsOn(tasks.classes, tasks.spotbugsMain) // dependencies
dependsOn(tasks.testClasses, tasks.spotbugsTest) // dependencies
}
app/build.gradle
plugins {
id 'com.github.spotbugs' version '6.0.7' // spotbugs plugin
}
tasks.register('qualityCheck') { // qualityCheck task
group = myBuildGroup // group
description = 'Runs checks (excluding tests).' // description
dependsOn tasks.classes, tasks.spotbugsMain // dependencies
dependsOn tasks.testClasses, tasks.spotbugsTest // dependencies
}
请注意,您不需要列出 Gradle 将执行的所有任务。只需在此处指定您想要收集的目标。Gradle 将确定它需要调用哪些其他任务才能达到这些目标。
在示例中,我们添加了 classes 任务(一个编译所有生产代码的生命周期任务)和 spotbugsMain 任务(检查我们的生产代码)。
我们还添加了一个描述,该描述将显示在任务列表中,有助于更好地区分这两个检查任务。
现在,如果运行 './gradlew :app:tasks',我们可以看到我们的新 qualityCheck 生命周期任务可用
$ ./gradlew :app:tasks
> Task :app:tasks
------------------------------------------------------------
Tasks runnable from project ':app'
------------------------------------------------------------
My app build tasks
------------------
build - Assembles and tests this project.
check - Runs checks (including tests).
qualityCheck - Runs checks (excluding tests).
run - Runs this project as a JVM application
tasksAll - Show additional tasks.
如果我们运行它,我们可以看到它运行 checkstyle 但不运行测试
$ ./gradlew :app:qualityCheck
> Task :buildSrc:checkKotlinGradlePluginConfigurationErrors
> Task :buildSrc:generateExternalPluginSpecBuilders UP-TO-DATE
> Task :buildSrc:extractPrecompiledScriptPluginPlugins UP-TO-DATE
> Task :buildSrc:compilePluginsBlocks UP-TO-DATE
> Task :buildSrc:generatePrecompiledScriptPluginAccessors UP-TO-DATE
> Task :buildSrc:generateScriptPluginAdapters UP-TO-DATE
> Task :buildSrc:compileKotlin UP-TO-DATE
> Task :buildSrc:compileJava NO-SOURCE
> Task :buildSrc:compileGroovy NO-SOURCE
> Task :buildSrc:pluginDescriptors UP-TO-DATE
> Task :buildSrc:processResources UP-TO-DATE
> Task :buildSrc:classes UP-TO-DATE
> Task :buildSrc:jar UP-TO-DATE
> Task :app:processResources NO-SOURCE
> Task :app:processTestResources NO-SOURCE
> Task :list:compileJava UP-TO-DATE
> Task :utilities:compileJava UP-TO-DATE
> Task :app:compileJava
> Task :app:classes
> Task :app:compileTestJava
> Task :app:testClasses
> Task :app:spotbugsTest
> Task :app:spotbugsMain
> Task :app:qualityCheck
BUILD SUCCESSFUL in 1s
16 actionable tasks: 5 executed, 11 up-to-date
到目前为止,我们已经查看了单个子项目中的任务,这在您在单个子项目中处理代码时对本地开发很有用。
通过此设置,开发人员只需要知道他们可以使用 :subproject-name:tasks 调用 Gradle 来查看哪些任务可用且对他们有用。