Gradleのプラグインを作成してみたくなったので、作ってみた。以下のリポジトリにコードがあるが、その主要点を書き残す。
https://github.com/matsudamper/kotlin-gradle-plugin-example
プラグイン側
build.gradle.kts
plugins {
// 現状ではGradle Kotlin DSLのKotlinは1.5.21に依存していると警告が出るので、1.5.21にしている。
id("org.jetbrains.kotlin.jvm") version "1.5.21"
// Kotlinで開発する上で便利なDSLを提供してくれる
`kotlin-dsl`
// Gradleのプラグインを作成するのに必要
`java-gradle-plugin`
// Mavenに配布するのに使用する
`maven-publish`
}
group = "net.matsudamper"
gradlePlugin {
(plugins) {
// package名が net.matsudamper.kotlin_gradle_plugin_example
// ファイル名が ExampleGradle.gradle.kts というファイルという場合の例
"net.matsudamper.kotlin_gradle_plugin_example.ExampleGradle" {
// 以下のように参照できる
// id("kotlin-gradle-plugin-example") version "1.0"
id = "kotlin-gradle-plugin-example"
version = "1.0"
// "${package名}.${ファイル名の先頭}Plugin" を付ける
// (<name>.gradle.kts -> <name>Plugin)
implementationClass = "net.matsudamper.kotlin_gradle_plugin_example.ExampleGradlePlugin"
}
}
}
ExampleGradle.gradle.kts
pluginを定義し、applyを呼ぶ。無名クラスは使用不可だった。
package net.matsudamper.kotlin_gradle_plugin_example import org.gradle.api.Project class ExampleGradle: Plugin<Project> { override fun apply(target: Project) { target.run { // exampleTaskというタスクを作成し、タスクを実行するとOKとプリントする。 tasks.create("exampleTask") { doLast { println("OK") } } } } } apply<ExampleGradle>()
末尾にPluginを付けた理由
build.gradle.ktsのimplementationClassに"${package名}.${ファイル名の先頭}Plugin" を付けた理由。
java-gradle-plugin を使用してjarファイルを作成した場合、jar(zip)をunzipしてみるとPluginが末尾に付いている。その為、末尾にPluginを付けた。末尾にPluginが付く理由は不明。
ローカルに配布する
./gradlew publishToMavenLocal
配布されたものを確認するために ~/.m2/repository/ の中を見てみる。グループにすると2つのものが見つかる。1つはPluginの定義が書かれただけのフォルダ、もう一つは実体であった。
Plugin定義
- kotlin-gradle-plugin-example/kotlin-gradle-plugin-example.gradle.plugin/
maven-metadata-local.xml
実体ファイルへの参照しか無い。
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>kotlin-gradle-plugin-example</groupId> <artifactId>kotlin-gradle-plugin-example.gradle.plugin</artifactId> <version>1.0</version> <packaging>pom</packaging> <dependencies> <dependency> <groupId>net.matsudamper</groupId> <artifactId>kotlin-gradle-plugin-example</artifactId> <version>1.0</version> </dependency> </dependencies> </project>
実体
- net/matsudamper/kotlin-gradle-plugin-example/
これでタスクが実行できる。
./gradlew exampleTask
User
使用する側は以下のように追加するだけ。
plugins {
id("kotlin-gradle-plugin-example") version "1.0"
}
settings.gradle にMavenLocalを追加する必要がある。
pluginManagement {
repositories {
mavenLocal()
gradlePluginPortal()
}
}