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での具体的な記述を説明している場合もあれば、それが無い場合もある。
決定的に、「こうすればいい」というところが言えないのがもどかしいところだが、何らかの参考にはなるだろう。