私はGradleを雰囲気でやっている
実務ではビルドツールにGradleを利用している。
だが何をやっているのかは、あまり理解出来ていない。
IntellijのタブからGradle タスクを実行するくらい。
メンタルモデルをちゃんと構築したいと思っていたので、
今回はGradleの公式ドキュメントのGetting Startedを進めていく。
Gradle Core Concepts
先にコアコンセプト読んで、チュートリアルでハンズオンするといいよと書かれているので、その通りに。
気になった箇所だけに絞って、メモしていく。
コアコンセプトの全体像
Gradle基礎
基本的な考え方として、「Gradle プロジェクト」がビルド対象として存在しており、ビルドスクリプト通りにビルドを実行。
またその時必要になる依存関係を管理し、細かい作業に関してはタスクという単位で命令を記述。
その他にはプラグインがあり、Gradleの機能を拡張しオプションでプロジェクトにタスクを提供するために使用。
このプラグインがあまりイメージが出来ていない。プラグインを使えば、ある程度用意されたタスクを自前で記述無しに利用できるので管理やビルドが楽になるという認識で正しいのだろうか。
リンク先の内容を見ると「プロジェクトにタスクを追加する」とあるので、あながち間違えではなさそう。
Gradle Pluginsについて:
- Gradle Plugin Reference
- The Java Plugin
- The Groovy Plugin
- Gradle - Plugin: nu.studer.jooq
- Gradle - Plugin: org.flywaydb.flyway
Gradle Wrapper基礎
Wrapper
使った方が良いよと言っている。
毎回誰がやっても同じGradleのバージョンを使用するので差異が無いし、それがIDEやCIとの相性もいいよっていう話。
Gradle CLI基礎
タスクの実行は、CLIからも出来るよと言っている。
実際に依存関係を細かく調べる時は./gradlew dependencies
を使っているので、少しだけ知っている。
設定ファイル基礎
設定ファイルの主な目的は、ビルドにサブプロジェクトを追加すること。
だが今回は単一プロジェクトを想定して読んでいるので、さらっと読む。
ビルドファイル基礎
ここでいうビルドスクリプトは、ビルド処理を記述したスクリプトファイル「build.gradle
」を指している。
Gradleやビルドスクリプトが依存しているライブラリの依存関係とプロジェクトのソースコードが依存しているライブラリの依存関係の2種類が追加可能であるという話。
これは、plugins
に書くかdependencies
に書くかで具体的なイメージができそう。
依存関係基礎
依存関係はbuild.gradle
に記載されていれば、プロジェクトに追加される。
以下のように、プラグイン
内とdependencies
内で追加可能。
また指定されたライブラリは、implementation
だとソースコードをtestImplementation
だとテストコードをコンパイルして実行するために利用される。
plugins { alias(libs.plugins.androidApplication) } dependencies { implementation(libs.googleMaterial) testImplementation(libs.mockitoCore) }
タスク基礎
タスクの実行はgradle
コマンドか./gradlew
などのGradle Wrapperを利用すること。
またプロジェクトで利用可能なタスクは全てGradleプラグインとビルドスクリプトから参照される。
以下のコマンドで、すべてのタスクを確認できる。
$ ./gradlew tasks
プラグイン
プラグインを利用することで、すでに用意されたタスクや設定を再利用できる。
またプラグインには以下3つの種類がある。
プラグインと依存関係の棲み分けは、必要なタスクや設定が少ないかどうかになるイメージ?
あとはソースコードやテスト関係無く必要なものに関しては、プラグインで用意する感じになるのかな。
Gradleのインクリメンタルビルドとビルドキャッシュ
- インクリメンタルビルド
- 前回ビルドから入力が変わっていない場合は、タスクの再実行は行わない
- タスクの横の
UP-TO-DATE
が目印
- ビルドキャッシュ
- ビルド結果の再利用
- ブランチ毎に持つことも可能で、無駄な作業とコストを減らす目的
上手に利用して、ローカルやCIのビルド時間を高速にすることが可能になる。
まとめ
なんとなく全体像は把握できたかなと思う。
注力したいトピックや基本用語の整理ができたので、次回以降は仕事で使える部分から優先的に理解していきたい。
現時点だと、「タスク」と「インクリメンタルビルド+ビルドキャッシュ」辺りを深掘りたいと考えている。