😊

Gradleのビルドライフサイクルについて

2023/02/14に公開

Gradleのビルドのライフサイクルについて調べてみたので、まとめてみました。
Gradleのビルドには、3つのフェーズがあり、Initialization phase、Configuration phase、Execution phaseの順でビルドが実行されます。
今回は、それぞれのフェーズで何をしているのかを調べてみました。

Initialization phase

Initialization phaseでは、設定ファイル(settings.gradle.ktssettings.gradleなど)の検出をして評価し、ビルドするプロジェクトを決定し、各プロジェクトに対してProjectインスタンスを作成するといったことを行います。

設定ファイルを含むディレクトリでGradleを実行すると、Gradleは設定ファイルを使用してビルドを初期化します。
設定ファイルの評価では、ビルドスクリプトのclasspathにライブラリの追加をおこなったり、Composite buildに参加するinclude buildを定義したりといったことを行いました。

Configuration phase

Configuration phaseでは、ビルドに参加している全てのプロジェクトの評価と、リクエストされたタスクに対してタスクグラフの作成を行います。
タスクグラフとは、Gradleの依存関係を示したグラフで、このグラフをもとにGradleのタスクを依存関係の順序で実行されることを保証するためのものです。
Configuration phaseの終了時には、Gradleは要求されたタスクの完全なタスクグラフを持つようになります。

このConfiguration phaseでConfiguration cacheを利用することで、ビルド速度を向上させることもできます。
Configuration cacheを使うことで、ビルド構成に影響を与えるものに変更が加わっていない場合、Configuration phaseをスキップすることができます。
Configuration cacheは、build cacheとは異なる情報をキャッシュしており、Configuration cacheはConfiguration phaseの出力を保存し、ビルドキャッシュは実行フェーズの出力を保存するようになっています。
詳しくは以下を参照してください🙇‍♂️
https://docs.gradle.org/current/userguide/configuration_cache.html

Execution phase

Execution phaseでは、選択された各タスクを依存関係のある順にスケジューリングして実行します。
Execution phaseでは、Configuration phaseで作成されたタスクグラフを元に、依存関係の順に実行するタスクを決定して実行します。
この実行には、ライブラリのダウンロード、コードのコンパイル、入力の読み込み、出力の書き込みなど、通常ビルドに関連する作業などが含まれています。

参考

https://docs.gradle.org/current/userguide/build_lifecycle.html

Discussion