gradleの動作の調べ方

gradleをいじる場合、その仕組みをマニュアルからは見つけ出せないことがある。ボランティアの方の努力により、かなりの部分が日本語訳されているが、英語のままの部分もかなり残っている。また、英語の部分を読んだとしても全くわからない場合も多々ある。このわかりにくさについては、なぜGradleは理解しづらいのか?に記述した。

どうしてもわからない場合には、動作させてみてどのようなクラスが使われているのかを見た方が話が早い。これはどんなプログラムにも言えることだ。

例えば、全くの他人が書いたプログラムのバグを修正しようとする場合、プログラムの最初から読もうとする者はいないだろう。動かしてみて、どの部分を通っているのか、あたりをつけ、徐々に問題にせまっていくのが普通だ。あるいは、それに何らかの機能を追加したい場合も同じことだろう。おおよそのあたりをつけ、次第に細かく見ていき、何をどうすれば良いか把握する。

dependenciesを調べる

ここがgradleの不思議なところなのだが(もちろん、このあたりもなぜGradleは理解しづらいのか?に書いたのだが)、例えばどこにでもprintlnが書けてしまう。これを利用して以下のように書いてみる。

repositories {
  println 'Delegate is ' + delegate.class
  jcenter();
  maven { 
    println 'Delegate is ' + delegate.class
    url 'https://ysugimura.github.io/maven' 
  }
}

task nothing() {
}

何でも良いのだが、nothing()というタスクを定義し、これを実行してみると、もちろんgradleは実行のたびにソースすべてが処理されるので、先のprintlnも出力される。すると、

Delegate is class org.gradle.api.internal.artifacts.dsl.DefaultRepositoryHandler_Decorated
Delegate is class org.gradle.api.internal.artifacts.repositories.DefaultMavenArtifactRepository_Decorated

といった出力がされる。この中の_Decoratedは何らかの理由で追加されているだけのようだ。これを除去した次を検索してみる。

  • org.gradle.api.internal.artifacts.dsl.DefaultRepositoryHandler
  • org.gradle.api.internal.artifacts.repositories.DefaultMavenArtifactRepository

DefaultRepositoryHandlerそのものは出てこないのだが、RepositoryHandlerが見つかる。

https://docs.gradle.org/current/javadoc/org/gradle/api/artifacts/dsl/RepositoryHandler.html

二番目のものについては、そのものズバリは出てこない。しかし最初のRepositoryHandlerの中に、次のような記述が見つかる。

MavenArtifactRepository     maven(Closure closure)
Adds and configures a Maven repository.

これをクリックすると、https://docs.gradle.org/current/javadoc/org/gradle/api/artifacts/repositories/MavenArtifactRepository.htmlページにたどりつく。

かならずしもこれらのマニュアルから使い方がばっちりわかるというわけではない。graldeでの具体的な記述を説明している場合もあれば、それが無い場合もある。

決定的に、「こうすればいい」というところが言えないのがもどかしいところだが、何らかの参考にはなるだろう。