🧟‍♂️

gradle pluginManagement {} ブロックとは

2021/11/25に公開

はじめに

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