はじめに
ちょっとしたものをプラグインとするのであればさっと書きやすいので、Precompiled script pluginsで作成したが何点か公開するには詰まったところがあった。それらを含めた備忘録をまとめる。
Precompiled script plugins とは
gradleファイルで書いたものをそのままプラグインにできる。
Precompiledが指す通りあらかじめコンパイルされる。そのため、完成物はバイナリプラグインでありjarができあがる。
使う上ではスタンドアロンプラグインと変わりない。
作り方
Precompiled script pluginsの場合、居たるところでplugin IDが影響するため、一番最初にIDを決める手順としている。
1.IDを決める
ポータルのPlugin IDs should trace back to the author
の見出しに書いてある。
ここでは見出し同様にGitHubをソースレポジトリとして公開する前提で話を進める。io.github.【ユーザーID】.【プラグイン名】
という規則性で決まる。
また、プラグイン名は英数と一部の記号という制約があるのでリファレンスを読んでそれらを満たすようにすること
例えば、GitHubのユーザーがjohndoe
で、プラグイン名がmyplugin
とする。その時のplugin IDはio.github.johndoe.myplugin
となる。
※ドメインを所持していればそれでも公開できるようだが、DNSレコードをいじったり何なりしないとできないらしい。
2.build.gradleを作る
plugins {
id 'java-gradle-plugin'
id 'groovy-gradle-plugin'
id 'com.gradle.plugin-publish' version '0.16.0'
}
group = '【プラグインID】'
version = '0.1'
tasks.whenTaskAdded { task ->
if(!'extractPluginRequests'.equals(task.name))return
gradlePlugin.plugins {
named('【プラグインID】') {
displayName = ''
description = ''
}
}
}
pluginBundle {
website = '【ソースURL】'
vcsUrl = '【ソースURL】'
}
置き換え文字
- 【プラグインID】
- 1で決めたIDと置き換える
- 【ソースURL】
- このプラグインのために作ったGitHubのレポジトリURL
plugins
Precompiled script pluginsを作るときの中心となるのがgroovy-gradle-plugin
です。これがバイナリプラグインを生成してくれます。
そして公開にはcom.gradle.plugin-publish
が必要です。この点はスタンドアロンプラグインと変わりません。
※ローカルで試す際には一時的にmaven-publish
を入れるのも手です。
※groovy-gradle-plugin
の裏側ではjava-gradle-plugin
が動くようなので一応書いていますが不要かも知れません。
gradlePlugin.plugins
本来であれば、build.gradle直下に以下のように書くものです。
gradlePlugin {
plugins {
//plugin parameters
}
位置は変わりますが、named('【プラグインID】')
の中へ書くことで同等の効果となり書き方も同様です。この際、IDは生成済みとなるため上書きしないでください。
プラグイン固有のdisplayNameやdescriptionを設定してください。
説明
Precompiled script pluginsは、各プラグイン定義がされるのが各種gradleコマンドを実行する際に動的に行われます。そのため起動直後には各プラグイン用の定義がありません。
逆にgradlePlugin.plugins
を書いてしまうと動的に行われる設定と二重定義になり落ちます。
その対策として、各プラグイン用の定義が生成された上で、それらへの修正として定義を混ぜ込みます。
具体的にはextractPluginRequestsの実行後に定義が完了しているため、蒸気のような記述となります。
pluginBundle
スタンドアロンプラグインと同様です。
3.プラグインファイルを作る
リファレンスの3段落目To apply ~~
に書いてある。
ディレクトリはsrc/main/groovy
ファイル名は【プラグインID】.gradle
例えば、plugin IDがmy.java-library-convention
だと、ファイル名はmy.java-library-convention.gradle
になる。
同様に「IDを決める」のところの例で出したio.github.johndoe.myplugin
だとio.github.johndoe.myplugin.gradle
になる。
参考先
-
リファレンス
- 主にPrecompiled script pluginsのセクションを読むが、plugin idなどの命名規則などはスタンドアロンに準ずるためすべて目を通す必要あり
-
ポータルへの公開方法その1
- gradleのユーザーガイド内のドキュメント
-
ポータルへの公開方法その2
- こっちはポータルで記載されてるドキュメント
- ↑2つは矛盾はないが載ってる内容が微妙に違うのでそれぞれから拾ってくる必要があった
-
Gradle のプラグインの作り方メモ
- こちらの記事はスタンドアロンプラグイン
-
[isssue]Docs for Publishing precompiled plugins
- 設定注入の参考元