gradle-embulk-pluginsを使ったメモ(Embulkプラグイン開発者用)


2020年3月現在、Embulkプロジェクトは最初のリリースから5年が経過し、バージョン1.0に向けての作業がすすんでいます。
マイルストーンについての情報は[Embulk v0.10 series, which is a milestone to v1.0](https://www.embulk.org/articles/2020/03/13/embulk-v0.10.html)を参考にすると良いでしょう。
この中で、プラグイン開発者は[gradle-embulk-plugins](https://github.com/embulk/gradle-embulk-plugins)の利用が推奨されています。
この文書は、自分のプラグインで`gradle-embulk-plugins`を使った際に調べたことやハマったことを記載します。

## 1 gradle-embulk-pluginsとは

そのうち

## 2 既存のプラグインのバージョンアップ方法

わざわざ書かなくても、手順はREADMEに書いてあります。

1. gradle5で廃止になる構文を書き換える
2. gradleのバージョンをあげる
3. gradle-embulk-pluginsを利用するようにbuild.gradleを書き換える
4. Dependency lockingの設定ファイルを作成する

### 2.1 gradle5で廃止になる構文を書き換える(``<<``->``doLast``)

以下のような警告がでる場合は、gradleのバージョンをあげる前に書き換えをおこないます。(gradleのバージョンが2.Xあたりを使っている人用)

```
> Configure project :
The Task.leftShift(Closure) method has been deprecated and
is scheduled to be removed in Gradle 5.0.
Please use Task.doLast(Action) instead.
```


```diff
diff --git a/build.gradle b/build.gradle
index c623a65..b835019 100644
--- a/build.gradle
+++ b/build.gradle
@@ -77,9 +77,11 @@ task gemPush(type: JRubyExec, dependsOn: ["gem"]) {
     script "pkg/${project.name}-${project.version}.gem"
 }

-task "package"(dependsOn: ["gemspec", "classpath"]) << {
-    println "> Build succeeded."
-    println "> You can run embulk with '-L ${file(".").absolutePath}' argument."
+task "package"(dependsOn: ["gemspec", "classpath"]) {
+    doLast {
+        println "> Build succeeded."
+        println "> You can run embulk with '-L ${file(".").absolutePath}' argument."
+    }
 }

 task gemspec {
```

### 2.2 gradleのバージョンをあげる

プラグイン内で`./gradlew wrapper --gradle-version x.y.z`を実行します。
`x.y.z`はアップデートしたい、gradleのバージョン番号です。

```
./gradlew wrapper --gradle-version 6.2.2
```

### 2.3 gradle-embulk-pluginsを利用するようにbuild.gradleを書き換える

[How to migrate old-style build.gradle of your Embulk plugins](https://github.com/embulk/gradle-embulk-plugins#how-to-migrate-old-style-buildgradle-of-your-embulk-plugins)に書いてあるとおりに作業をします。

### 2.4 Dependency locking用のファイルを作成する

`./gradlew dependencies --write-locks`を実行して、`gradle/dependency-locks/embulkPluginRuntime.lockfile`を作成します。

このファイルは以下のようにプラグインで利用するライブラリの依存情報が記載されています。
プラグイン内で利用するライブラリのバージョンが上がったら、再度コマンドを実行して情報を更新します。

```
# This is a Gradle generated file for dependency locking.
# Manual edits can break the build and are not advised.
# This file is expected to be part of source control.
com.jayway.jsonpath:json-path:2.4.0
net.minidev:accessors-smart:1.2
net.minidev:json-smart:2.3
org.ow2.asm:asm:5.0.4
```

## 4. その他

### 4.1 Gradleの警告(compileOnly)


```
The compileOnly configuration has been deprecated for resolution. This will fail with an error in Gradle 7.0.
```

そのうち直ると思うので無視しましょう

https://twitter.com/dmikurube/status/1238458550600347648?s=20

### 4.2 Exec.getLogger

`LoggerFactory.getLogger`を代わりに使うようです。
[Use the "org.embulk.embulk-plugins" Gradle plugin to build](https://github.com/embulk/embulk-input-jdbc/pull/178/commits/d3c1b6e4074b9c0beee36a8ddd43694f244cb61b)

### 4.3 FindBugs

Gradle 6.XではFindBugsは使えないっぽいので[SpotBugs]()を使うのが良いように思っています。設定方法がわかる人がいたら教えてください。(調査中)

https://gist.github.com/hiroyuki-sato/6e3698cf92ff55ca881bc846e91bfd12

## 5 プライベートリンク

* [dependenciesの書き方](https://gist.github.com/hiroyuki-sato/3e261ef8eb2d092b3d83ae637b9ffd29)