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