Gradleの基礎固め - Core Concepts編

私はGradleを雰囲気でやっている

実務ではビルドツールにGradleを利用している。
だが何をやっているのかは、あまり理解出来ていない。
IntellijのタブからGradle タスクを実行するくらい。

メンタルモデルをちゃんと構築したいと思っていたので、
今回はGradleの公式ドキュメントのGetting Startedを進めていく。

docs.gradle.org

Gradle Core Concepts

先にコアコンセプト読んで、チュートリアルでハンズオンするといいよと書かれているので、その通りに。
気になった箇所だけに絞って、メモしていく。

コアコンセプトの全体像

全体像イメージ図

Gradle基礎

基本的な考え方として、「Gradle プロジェクト」がビルド対象として存在しており、ビルドスクリプト通りにビルドを実行。
またその時必要になる依存関係を管理し、細かい作業に関してはタスクという単位で命令を記述。
その他にはプラグインがあり、Gradleの機能を拡張しオプションでプロジェクトにタスクを提供するために使用。

このプラグインがあまりイメージが出来ていない。プラグインを使えば、ある程度用意されたタスクを自前で記述無しに利用できるので管理やビルドが楽になるという認識で正しいのだろうか。
リンク先の内容を見ると「プロジェクトにタスクを追加する」とあるので、あながち間違えではなさそう。

Gradle Pluginsについて:

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つの種類がある。

  1. コアプラグイン
    1. java
    2. groovy
  2. コミュニティプラグイン
    1. org.springframework.boot
  3. ローカルプラグイン
    1. 自作プラグイン

プラグインと依存関係の棲み分けは、必要なタスクや設定が少ないかどうかになるイメージ?
あとはソースコードやテスト関係無く必要なものに関しては、プラグインで用意する感じになるのかな。

Gradleのインクリメンタルビルドとビルドキャッシュ

  • インクリメンタルビルド
    • 前回ビルドから入力が変わっていない場合は、タスクの再実行は行わない
    • タスクの横のUP-TO-DATEが目印
  • ビルドキャッシュ
    • ビルド結果の再利用
    • ブランチ毎に持つことも可能で、無駄な作業とコストを減らす目的

上手に利用して、ローカルやCIのビルド時間を高速にすることが可能になる。

まとめ

なんとなく全体像は把握できたかなと思う。
注力したいトピックや基本用語の整理ができたので、次回以降は仕事で使える部分から優先的に理解していきたい。
現時点だと、「タスク」と「インクリメンタルビルド+ビルドキャッシュ」辺りを深掘りたいと考えている。