kagamihogeの日記

kagamihogeの日記です。

Gradle 7.2でcustom pluginをlocalのMavenリポジトリに登録

gradleで複数プロジェクトを作成すると共通のビルドスクリプトを共有したくなる。方法は場合に応じて色々あるが、ここではcustom pluginをMavenリポジトリにpublishする方法を述べる。動作確認のためにlocalのMavenリポジトリを使うが、publish先をremoteやGradle Plugin Portalへの変更は基本的にはpublish周りの設定変更で対応できると思われる。

環境

ソースコード

custom pluginプロジェクト

まずcustom pluginを配置するプロジェクトを新規作成する。gradle initの際にtypeで4: Gradle pluginを選ぶ。

> gradle init
Starting a Gradle Daemon, 3 incompatible and 1 stopped Daemons could not be reused, use --status for details

Select type of project to generate:
  1: basic
  2: application
  3: library
  4: Gradle plugin
Enter selection (default: basic) [1..4] 4

Select implementation language:
  1: Groovy
  2: Java
  3: Kotlin
Enter selection (default: Java) [1..3] 1

Select build script DSL:
  1: Groovy
  2: Kotlin
Enter selection (default: Groovy) [1..2] 1

Project name (default: samplecustomplugin):
Source package (default: samplecustomplugin):

> Task :init
Get more help with your project: https://docs.gradle.org/7.2/userguide/custom_plugins.html

BUILD SUCCESSFUL in 20s
2 actionable tasks: 2 executed

最終的なディレクトリ構成は下記のようになる。なおgradle initが生成したもののうちこのエントリで触れないもの(testなど)は省略している。

─plugin
    │  build.gradle
    └─src
        └─main
            └─groovy
                │  kagamihoge.custom.plugin.gradle
                │
                └─samplecustomplugin
                        SamplecustompluginPlugin.groovy

build.gradle

samplecustomplugin\plugin\build.gradleを修正する。

plugins {
    id 'java-gradle-plugin'
    id 'groovy-gradle-plugin'
    id 'maven-publish'
    id 'groovy'
}

group = 'com.kagamihoge.gradleplugin'
version = '1.0'

repositories {
    mavenCentral()
}

gradlePlugin {
    plugins {
        greeting {
            id = 'samplecustomplugin.greeting'
            implementationClass = 'samplecustomplugin.SamplecustompluginPlugin'
        }
    }
}

publishing {
    repositories {
        maven {
            name = 'localPluginRepository'
            url = 'C:/.../.m2/repository'
        }
    }
}
  • plugins
    • id 'groovy-gradle-plugin' - 直接は関係無いがprecompiled scriptを個人的に使いたかったため。
    • id 'maven-publish' - Mavenリポジトリにpublishするため。
  • group/version
    • 最終的にjarをpublishするので適当な値を指定。
  • gradlePlugin
    • ここはgradle initで生成されるサンプルコードそのまま。idはplugin使用側で使う。
  • publishing

custom plugin

サンプルとしてcustom pluginを2つ作成する。

1つ目はgradle initが生成するsamplecustomplugin\plugin\src\main\groovy\samplecustomplugin\SamplecustompluginPlugin.groovyで、これは特に手を入れないのでソースは省略。

2つ目precompiled scriptのサンプルでsamplecustomplugin\plugin\src\main\groovy\kagamihoge.custom.plugin.gradleを新規作成する。中身は以下の通り。適当なtaskと適当なextを入れておく。

tasks.register('kagamihogeHello') {
    doLast {
        println 'Hello world!'
    }
}

ext.samplevalue = 'samplevalue'

これでpublishする。

gradle publish

正常終了すればC:\...\.m2\repository\com\kagamihoge\gradleplugin\plugin\1.0plugin-1.0.jarが生成される。これでlocalのMavenプロジェクトにcustom pluginが登録されたので、次はこれを使用してみる。

custom pluginを使う側のプロジェクト

まず適当なgradleプロジェクトを新規作成する。

settings.gradle

pluginの参照先リポジトリにlocalのMavenプロジェクトを含めるためsetting.gradleにその設定を追加する。

pluginManagement {
  repositories {
      mavenLocal()
  }
}

rootProject.name = 'samplecustomuser'

build.gradle

plugins {
    id 'samplecustomplugin.greeting' version '1.0'
    id 'kagamihoge.custom.plugin' version '1.0'
}

println ext.samplevalue
  • samplecustomplugin.greeting - gradle initが生成したサンプルのcustom plugin. gradlePluginのとこで指定したidを使用。
  • kagamihoge.custom.plugin - precompiled scriptのサンプル。詳しい事は調べてないがconventionalでこのidになるみたい。

動作確認にtaskを実行する。

> gradle kagamihogeHello greeting

> Configure project :
samplevalue

> Task :kagamihogeHello
Hello world!

> Task :greeting
Hello from plugin 'samplecustomplugin.greeting'

BUILD SUCCESSFUL in 741ms
2 actionable tasks: 2 executed

publish先をremoteやGradle Plugin Portalに変更

remoteのMavenリポジトリは他の成果物同様Maven Publish Pluginに沿った設定になると思われる。

Gradle Plugin Portalは公式のPublishing Plugins to the Gradle Plugin Portalに解説がある。

参考文献