はじめに
DroidKaigi 2022のリポジトリのsettings.gradle.ktsを読んでいました。
普段シングルプロジェクトで開発を行なっている場合には出会わないようなブロックやメソッドが散りばめられていて、gradle初心者にはかなりの圧迫感がありました。
そこで、自分のメモとしてsettings.gradle.ktsに登場する各ブロックやメソッドの意味などをまとめてみました。
参考程度にお読みいただけたら幸いです。
build.gradleとは
build.gradleにはビルドの内容がGroovy言語によって記述されています。
ビルドの内容とは、依存関係や依存関係の解決に使われるMavenなどのリポジトリのことを指します。
settings.gradleとは
settings.gradleは、Gradleによって自動的に生成されるファイルです。
このファイルもまた、Groovy言語によって内容を記述します。
マルチプロジェクトでは、build.gradleはプロジェクトごとに複数用意されますが、settings.gradleはGradle ビルドごとに必ずひとつのsettings.gradleのみが実行されます。
つまり、settings.gradleには、プロジェクト全体の依存関係の解消に関する内容が記述されています。
pluginManagement {}
pluginManagement {}は、ファイルの最初に記述する必要があります。
通常、plugins {}を使ってプラグインを指定した時、GradleはGradle Plugin Portalを使ってプラグインを解決します。
しかし時には、プライベートなMavenやIvyリポジトリを使ってプラグインを解決したい場合があると思います。
そうした場合に、pluginManagement{}内に存在するrepositories{}を使って、カスタムプラグインリポジトリを指定することができます。
また、resolutionStrategy {}を使用することで、特定のプラグインをplugins{}で使用可能なID名に変換して解決するといったことも可能になります。
includeBuild()を使うことで、第一引数に指定したパスに含まれるプラグインビルドをComposite Buildにインクルードすることができます。
インクルードされたプラグインビルドは、設定の共通化に寄与したり、プロジェクトプラグインとしての機能を提供してくれます。
Composite Buildとは
公式ドキュメントには次のように書かれています。
A composite build is simply a build that includes other builds. In many ways a composite build is similar to a Gradle multi-project build, except that instead of including single projects, complete builds are included.
つまり、他のビルドを含むビルドのことをComposite Buildと呼びます。そして複数のプロジェクトがインクルードされているわけではなく、完全なビルドがインクルードされています。そして、このインクルードされているビルドのことをIncluded Buildと呼びます。それぞれのIncluded Buildは互いに独立していて、設定も共有されていませんし個別に実行されるものです。
enableFeaturePreview()
enableFeaturePreview()は実験的機能を有効にしたい場合に使用します。
例えば、enableFeaturePreview("TYPESAFE_PROJECT_ACCESSORS")は、型安全性の提供とIDEでのコード補完を可能にしてくれるプロジェクトアクセサとして実験的機能を有効化します。
これにより、以前はproject(":some:path")で参照していたものをprojects.some.pathで参照できるようになります。
dependencyResolutionManagement{}
dependencyResolutionManagement{}を使用すると、慣習的に各build.gradleで宣言されていたリポジトリを1箇所で中央集権的に宣言することができます。そしてデフォルトでは、各プロジェクトで宣言されたリポジトリの設定は、dependencyResolutionManagement{}での設定を上書きします。この設定は変更することもできます。
include()
include()を使って、ビルドに含めるプロジェクトを指定することができます。このパスに指定するのは絶対パスや相対パスといったファイルベースのパスではなく、プロジェクトのヒエラルキー上のパスを指定します。そのため、区切りには:を使います。
パスの最後の要素がプロジェクト名として使用されます。例えばパスが:a:bなら、bがプロジェクト名として採用されます。
例えば、include(":a:b")を呼び出した場合、次のような構成になります。
| ラベル | 実際の値 |
|---|---|
| パス | :a:b |
| 名前 | b |
| プロジェクトディレクトリ | $rootDir/a/b |
project().projectDirを使うことで、プロジェクトディレクトリを任意のものに変更することができます。
include(":appioscombined")
project(":appioscombined").projectDir = file("app-ios-combined")
まとめ
Gradleは一見すると難しそうに見えますが、やっていることはとてもシンプルなので理解度次第でハードルは一気に下がるんだろうなと思いました。まる。
参考にした記事