nologyance.net

日々のアウトプット

Gradleのキャッシュ

MavenとGradle

Java界隈のビルドツールといえば、ほぼこの二択といっても差し支えないのではないでしょうか。 Javaに触れたことがない人はbundleやnpmのようなものとイメージしてもらえればと思います。 複雑なライブラリの依存関係を管理することが主な責務ですが、どちらのツールについてもビルドに関する便利機能が一通り備わっています。 詳しくはググってみてください。

ニッチな需要

先ほど述べた通り、どちらかのツールを使えば大抵のことは出来ます。 標準機能に備わっていない場合でも、自分がやりたいと思ったことは技術力のある誰かが既にプラグインとして公開してくれていることが多いです。 そんな優秀なツール達ですが、逆にいうと機能が豊富すぎて一度ハマるとなかなか原因が特定出来ないのが玉に瑕。 特にGradleのキャッシュについてはかなり注意が必要です。

Gradleのキャッシュ機構

Gradleのキャッシュには「タスク」と「依存」の大きく2種類があります。

タスクキャッシュ

タスクキャッシュはあるタスクが実行されるときのINOUTを前回の実行時の状態と比較し、変化していなければタスクをスキップするという機能です。 この機能によりタスクの実行時間を短縮します。

依存キャッシュ

ビルドに利用するライブラリを「.gradleディレクトリ配下」にキャッシュし、バージョンが変わっていなければ再利用するという機能です。

依存キャッシュと混同しやすいMavenLocal

また、リポジトリとしてMavenLocalを指定している場合、依存キャッシュと類似した振る舞いになります。 具体的には、次のような動きになります。 Mavenでのビルドが実行されると、MavenLocalリポジトリ(通常は${USER_HOME}/.m2)にライブラリがキャッシュされていきます。 このとき、GradleはライブラリをMavenLocalから取得するため、外部への接続が行われないままビルドが実行されます。 一定期間ごとにキャッシュは破棄されますが、MavenLocalの更新タイミングによっては想定外の動作をすることも。

依存キャッシュに振り回されないためには

Gradleビルドの実行時に「--refresh-dependencies」オプションを利用すると依存キャッシュを強制的に破棄させることができます。 MavenLocalが消えるわけではないので注意。気になる方はリポジトリからMavenLocalの設定を外しましょう。

キャッシュは有効に使いましょう。

ビルドツールとしてMavenを同じマシンで利用している場合、MavenLocalの利用はビルド時間の短縮に有効ですが、 仕組みを理解していないと予期せぬ動作につながる可能性もあります。