gradle pluginManagement {} ブロックとは
はじめに
Gradleを用いたツールの設定手順で、pluginManagement {}
ブロックをsetting.gradle
に記述することがあります。とりあえずマニュアル通りに記述すれば設定が完了することが多いのですが、ドキュメントが古いなどで設定が詰まった時はこの構文を理解していないと何が問題かわかりません。
ここでは、pluginManagement {}
について説明します。
pluginManagement {}
は plugin{}
ブロックの設定をしている
pluginManagement {}
は、build.gradle
ファイルのplugin {}
に関する設定を記述しています。
plugin{}
ブロックは、以下のようにbuild.gradleが利用するライブラリを設定します。
// build.gradle.kts
plugins {
id("org.gradle.java")
kotlin("jvm") version "1.2.40"
}
plugins{}
と同様に、プラグインを設定する記述としてapply(plugin = "..")
という記述があるのですが、apply
の構文は可読性などの問題から非推奨となっています。しかし、plugins{}
の構文で書かれたプラグインは、Gradleが提供しているCore Pluginと、Gradle Plugin Portalで公開されたpluginしか利用できないという欠点があります。そのため、そのままでは外部ライブラリをplugins{}
構文は呼び出せません。
この設定を変更するのが pluginManagement {}
です
◇設定の例
pluginManagement {
repositories {
gradlePluginPortal()
jcenter()
google()
}
resolutionStrategy {
eachPlugin {
if (requested.id.id == "com.android.application") {
useModule("com.android.tools.build:gradle:${requested.version}")
}
}
}
}
この記述では、plugin{}
が解消可能なrepositories
の設定を追記し、"com.android.application" から始まるpluginはuseModule("com.android.tools.build:gradle:${requested.version}")
のパスを利用して依存関係を解消するという指定をおこなっています。
これにより、plugin{}
構文が Core PluginとGradle Plugin Portalからしか依存関係を解消できないという問題を解決しています。
pluginManagement{}
はbuild.gradle
ではなくsetting.gradle
ファイルに記述されるのか
何故setting.gradle
ファイルは、build.gradle
と違ってプロジェクト全体に適用されるファイルになります。gradleはマルチプロジェクトの構成をとることができるため、build.gradle
は複数存在し得ます。そのため、すべての設定ファイルで個別にplugin
の設定を記述するのではなく、setting.gradle
ファイルに設定を記述することで、プロジェクト全体の依存関係を解消できるようにします。
Discussion