kdnakt blog

hello there.

GradleのBaseプラグインのライフサイクルタスクを追加する

今日はこのドキュメントを参考に手を動かしてみる。

docs.gradle.org

 

 

[Baseプラグイン]

Baseプラグインは最も基本的なタスクやルールを提供してくれる。

利用するには、以下の記述をbuild.gradle.ktsに追加する。

plugins {
    base
}

 

中でも、Baseプラグインが提供するライフライクルタスクが最も重要らしい。

ライフライクルタスクについては、こちらのドキュメントに説明がある。

docs.gradle.org

 

ライフサイクルタスク自身は何も処理をしないが、複数のタスクをまとめてくれるらしい。

Base pluginが提供するライフサイクルタスクはassemblecheckbuildの3つがある。JavaやKotlinのGradleプラグインもこのBaseプラグインを利用しているため、基本的にはBaseプラグインを単体で利用する必要はなく、各言語のGradleプラグインを利用すればよさそうだ。

 

[ライフサイクルタスクにタスクを追加する]

プラグインの開発者やビルドの管理者は、check.dependsOn(task)のようにライフサイクルタスクに独自のタスクを追加できるらしいので、実際にやってみる。

以下のようなbuild.gradle.ktsファイルを用意する。

plugins {
	base
}

val taskX by tasks.registering {
	doLast {
		println("taskX")
	}
}
check.dependsOn(taskX)

 

gradle -q checkを実行すると、以下のようにエラーになってしまった。

* What went wrong:
Script compilation error:

  Line 10: check.dependsOn(taskX)
           ^ Unresolved reference. None of the following candidates is applicable because of receiver type mismatch: 
               public val TaskContainer.check: TaskProvider<DefaultTask> defined in org.gradle.kotlin.dsl

1 error

 

直接checkタスクを呼び出せるわけではないらしい。

自分で定義したタスクにアクセスする場合は、tasks.named("myTask")のようにアクセスする必要があるが、Gradleプラグインによって定義されたタスクの場合は、tasks.pluginTaskのようにアクセスすることができる(参考:Locating tasks)。

しかし、tasks.check.dependsOn(taskX)のように修正したところ、実行時に以下のエラーとなった。

* What went wrong:
Script compilation error:

  Line 10: tasks.check.dependsOn(taskX)
                       ^ Unresolved reference: dependsOn

 

仕方ないので、やや冗長になるが以下のように修正した。

tasks.check {
    dependsOn(taskX)
}

 

これで、checkタスクを実行すると以下のように出力された。

$ gradle -q check
taskX

 

無事、taskXをcheckタスクの依存関係に追加し、ライフサイクルタスクの実行時に独自のタスクを実行することができた。

 

[まとめ]

  • Baseプラグインはcheck、build、assembleのライフサイクルタスクを提供してくれる
  • 各言語のGradleプラグインはBaseプラグインを自動的に適用してくれる
  • ライフサイクルタスクに独自のタスクを追加する場合、通常の依存関係追加と同様dependsOn()を呼び出せば良い
  • サンプルコードは以下のリポジトリにまとめてある

github.com