Gradle taskのdoFirstとdoLast

Gradle のtask定義
doFirstとdoLastの違いについて

TaskのleftShiftはもう使えない。

task hello << {
    println "hello"
}

この書きたかはGradle3くらいから警告の出るものになった。

代わりにこのようにして書く。

task hello {
    doLast {
        println "hello"
    }
}

で、いまいちこのdoLastって何かよくわかっていなかったが、
タスク実行時の後処理を書けるってことなのか!
と、やっと理解できました。
まぁ、doLastだからそのままなんやけど…。

task hello {
    println "hello"
}

こう書くのと何が違うのかが、理解できてなかったんだよね。

処理実行のタイミング

task hello {
    println "タスクインスタンス化で処理される"
    doFirst { println "タスク実行の前に処理される" }
    doLast  { println "タスク実行の後に処理される" }
}

上記の通り、それぞれ実行されるタイミングが違います。

$ ./gradlew hello
タスクインスタンス化で処理される
:hello
タスク実行の前に処理される
タスク実行の後に処理される

タスクのインスタンス化時というのは、
build.gradleが読み込まれたタイミングなので、
./gradlew hello としなくても、./gradlew task とかした場合にでも実行されるところになります。

doFirstでタスク実行前のチェック

タスクのdoFirstを使えば、
タスク実行前に必要なパラメータのチェックを挟む事ができます。

task exec(type: JavaExec) {
    classpath = sourceSets.main.runtimeClasspath
    workingDir = new File(".").absolutePath
    systemProperties = System.properties 

    doFirst {
        if (!project.hasProperty("main")) {
            throw new IllegalArgumentException("""
                |usage:
                |        ./gradlew exec -Pmain=<ClassName>
                |""".stripMargin())
        }

        main = project.main
    }
}

実行するMainクラスを指定して、実行してくれるタスクです。
Mainクラスが指定されていないと、usageを出力してタスクとしては失敗するということができますね。

おしまい

最近ブログが更新できていなかったので そろそろちゃんとしよう。
今年も一年あっという間で、 春頃は2、3日に1記事目標で頑張ってたんですが、流石にきつかった…。
段々意識が薄れて書かなくなっちゃうので、気を付けます。

コメントを残す