Gradle でタスクを実行する時に、プラグインにより SourceSets に対して自動的に追加されるタスクなどを実行せずに除外したい場合がある。 タスクの除外の仕方について調べたことをメモ。

$ java -version
openjdk version "11.0.6" 2020-01-14 LTS
OpenJDK Runtime Environment Corretto-11.0.6.10.1 (build 11.0.6+10-LTS)
OpenJDK 64-Bit Server VM Corretto-11.0.6.10.1 (build 11.0.6+10-LTS, mixed mode)

$ ./gradlew --version

------------------------------------------------------------
Gradle 6.2.2
------------------------------------------------------------

Build time:   2020-03-04 08:49:31 UTC
Revision:     7d0bf6dcb46c143bcc3b7a0fa40a8e5ca28e5856

Kotlin:       1.3.61
Groovy:       2.5.8
Ant:          Apache Ant(TM) version 1.10.7 compiled on September 1 2019
JVM:          11.0.6 (Amazon.com Inc. 11.0.6+10-LTS)
OS:           Mac OS X 10.14.6 x86_64

コード例

適当な Gradle プロジェクトを用意し、 build.gradle に以下のようにタスクを定義する。

task checkMain {
    doLast {
        println "Main"
    }
}

def taskNames = ["First", "Second", "Third"];
taskNames.eachWithIndex { name, i ->
    task "check$name" {
        doLast {
            println "$name"
        }
    }
    if (i > 0) {
        tasks.getByName("check$name").dependsOn("check${taskNames[i-1]}")
    }
    if (i == 2) {
        checkMain.dependsOn("check$name")
    }
}

task checkStart {
    dependsOn "checkMain"
    doLast {
        println "Start"
    }
}

checkStart を実行すると以下のようにジョブが実行される。

$ ./gradlew checkStart

> Task :checkFirst
First

> Task :checkSecond
Second

> Task :checkThird
Third

> Task :checkMain
Main

> Task :checkStart
Start

BUILD SUCCESSFUL in 2s
5 actionable tasks: 5 executed

このコードを例に除外する設定をおこなう。

依存も含めてそのタスクを全て除外する場合

以下の3つは全て同じ動作となり、実行するとそのタスクの依存を含めて全て除外して実行する。 settings.gradle, build.gradle に記載した場合プロジェクトから完全に除外される。

$ ./gradlew checkStart -x checkSecond

> Task :checkThird
Third

> Task :checkMain
Main

> Task :checkStart
Start

BUILD SUCCESSFUL in 1s
3 actionable tasks: 3 executed

コマンドラインオプションを指定する

$ ./gradlew checkStart -x checkSecond

settings.gradleに設定を書く

startParameter.excludedTaskNames= ["checkSecond”]

build.gradle に設定を書く

project.gradle.startParameter.excludedTaskNames.add("checkSecond")

一部の依存タスクのみ除外したい場合

除外ではなく正確には無効化だが、以下の2種類によって実現できる。実行すると次のようになる。 除外した checkSecond のみがスキップされ、 checkSecond の依存タスクである checkFirst は実行されている。

$ ./gradlew checkStart

> Task :checkFirst
First

> Task :checkThird
Second

> Task :checkMain
Main

> Task :checkStart
Start

BUILD SUCCESSFUL in 1s
4 actionable tasks: 4 executed

タスク生成時に無効化する

tasks.whenTaskAdded { task ->
    if (task.name.startsWith("checkSecond")) {
        task.enabled = false
    }
}

TaskExecutionGraph 作成時に無効化する

gradle.taskGraph.whenReady { graph ->
    if (graph.hasTask(checkMain)) {
        tasks.findByName("checkSecond").enabled(false)
    }
}

参考

Gradle Official Document: Build Script Basics

Gradle Official Document: Build Lifecycle

StackOverFlow: How can I disable a task in build.gradle