かまたま日記3

プログラミングメイン、たまに日常

gradle-embulk-pluginを作った #Embulk

TL;DR

EmbulkのJavaプラグイン開発のときにいろいろ便利につかえるGradleのプラグインを作りました。

github.com

plugins.gradle.org

使い方

最低限以下の記述を build.gradle にすれば動きます。最新バージョンは 0.5.0 です (2019/03/24現在)

plugins {
  id "com.github.kamatama41.embulk" version "0.5.0"
}

embulk {
    version = "0.8.18"  // 使うEmbulkのバージョン
    category = "file-input"  // 作るプラグインのカテゴリ (embulk newの時に指定するカテゴリ)
    name = "xlsx"  // 作るプラグインの名前

    // 作者名、メールアドレス、ホームページ (gemspecタスク用)
    authors = ["A User"]  
    email = "a.user@example.com"
    homepage = "https://github.com/a.user/embulk-input-xlsx"
}

何ができるか?

プラグインテンプレート生成

newPlugin タスクを実行することで embulk new コマンドを実行したときと同じテンプレートを生成することができます。*1

% gradle newPlugin
Starting a Gradle Daemon (subsequent builds will be faster)
:embulkSetup
Setting Embulk version to 0.8.18
:embulk_new_java-file-input_xlsx
2017-03-21 04:12:05.020 +0900: Embulk v0.8.18
Creating embulk-input-xlsx/
  Creating embulk-input-xlsx/README.md
  Creating embulk-input-xlsx/LICENSE.txt
  Creating embulk-input-xlsx/.gitignore
  Creating embulk-input-xlsx/gradle/wrapper/gradle-wrapper.jar
  Creating embulk-input-xlsx/gradle/wrapper/gradle-wrapper.properties
  Creating embulk-input-xlsx/gradlew.bat
  Creating embulk-input-xlsx/gradlew
  Creating embulk-input-xlsx/config/checkstyle/checkstyle.xml
  Creating embulk-input-xlsx/config/checkstyle/default.xml
  Creating embulk-input-xlsx/build.gradle
  Creating embulk-input-xlsx/lib/embulk/input/xlsx.rb
  Creating embulk-input-xlsx/src/main/java/org/embulk/input/xlsx/XlsxFileInputPlugin.java
  Creating embulk-input-xlsx/src/test/java/org/embulk/input/xlsx/TestXlsxFileInputPlugin.java

Plugin template is successfully generated.
Next steps:

  $ cd embulk-input-xlsx
  $ ./gradlew package

:newPlugin

BUILD SUCCESSFUL

Total time: 13.166 secs

既存Gradleタスクを網羅

Embulkのプラグイン開発時、最初に embulk new java-input foo のようなコマンドで雛形を生成すると思うのですが、そのときに出来る build.gradle で定義されてるタスクや処理はすべて利用可能です。具体的にはこのテンプレートに記述されてる以下のタスクになります。

これらのタスクはプラグイン側で定義してるので、書く必要が無くなります。*2

"org.embulk:embulk-core" の依存関係を省略可能

プラグイン側で、指定した version に対応したライブラリを追加するので以下の compile provide の記述を書く必要がありません。

dependencies {
    compile  "org.embulk:embulk-core:<embulk-version>"
    provided "org.embulk:embulk-core:<embulk-version>"
}

任意のEmbulkコマンドをGradleタスクとして実行可能

embulk_* のタスクを実行することで任意のembulkコマンドを実行できます。コマンド引数は _ で区切ります。

たとえば、 embulk_--version タスクは embulk --version が実行されます。

% ./gradlew embulk_--version
:embulkSetup
:embulk_--version
embulk 0.8.18

BUILD SUCCESSFUL

Total time: 4.129 secs

embulk_gen_install_embulk-input-hoge タスクは embulk gem install embulk-input-hoge が実行されます。

% gradle embulk_gem_install_embulk-input-command
Starting a Gradle Daemon (subsequent builds will be faster)
:embulkSetup
:embulk_gem_install_embulk-input-command
2017-03-22 07:21:11.578 +0900: Embulk v0.8.18
Successfully installed embulk-input-command-0.1.4
1 gem installed

BUILD SUCCESSFUL

Total time: 13.134 secs

テスト実行が簡単にできる

また、開発中のJavaプラグインをテスト実行(run, preview, guessなど)する場合、以下のような手順を踏むことになると思います。

  1. gradle package でJarライブラリを作る
  2. embulk run-L オプションでクラスパスを追加する

embulk_run タスク*3はそれを全部1コマンドにまとめたタスクです。さらに

  • embulk_run の時のconfigファイルはデフォルトで config.yml
  • embulk_guess の時の出力ファイルは output.yml

指定されます。つまり

  • gradle embulk_run = gradle package && embulk run config.yml -L .
  • gradle embulk_guess = gradle package && embulk guess config.yml -o output.yml -L .

とほぼ同義です。設定ファイルのパスを変えたい場合は プロパティ configYaml, outputYaml を渡してて下さい。

$ ./gradlew embulk_guess -PconfigYaml=myconfig.yml -PoutputYaml=myoutput.yml

さいごに

Embulkプラグイン開発者の方は、是非、使ってみて下さい!

*1:実際の処理でもembulk newを実行したあと必要なファイルをコピーしてきてます

*2:もちろん必要があれば上書きできます

*3:preview, guess, cleanupも同様