2016/2/29 追記
こっちの方法の方が安定するかも。 embulk bundleだけでJavaで書かれたプラグインをインストールし利用する方法 - Qiita
今週末の成果として、タイトル通りの機能を持ったembulk_javundlerというgemを作りました。
モチベーションとしては、javaのプラグインで開発中だったりgemとしてリリースするまでもないプライベートなプラグインをgitのリポジトリから直接インストールして使いたかったからです。
普通にjrubyのgemとして作成されているプラグインはembulk自体が持つbundle機能でインストールできるんですが、javaのプラグインはbundlerでは検知できないので、こういう仕組みが必要でした。
めっちゃ雜に作ったので、細かい挙動は何かおかしいかもしれません。名前もちょっと適当感があるw
仕組みは単純で、DSLを記述したファイルから情報を読み込んで、git clone
してから./gradlew gem
やってコンパイルするだけです。
そしてembulkコマンド実行時に、インストール先のディレクトリ情報からlibpathを自動でコマンドに付与します。
Embulkfileというファイルを作って以下の様に記述します。
java_plugin "embulk-input-jdbc", github: "joker1007/embulk-input-jdbc", commit: "support-json-type", libdir: "embulk-input-postgresql/lib"
java_plugin "embulk-output-bigquery", github: "embulk/embulk-output-bigquery"
これはRubyのDSLになってます。
libdir
を指定することで、embulk-input-jdbcの様にサブプロジェクトを持つタイプのプラグインにも対応できます。
後は、bundlerっぽくコマンドを実行します。
$ embulk_javundler install --path .embulk_plugins
$ embulk_javundler guess base.yml -o config.yml
$ embulk_javundler preview config.yml
$ embulk_javundler run config.yml
runじゃなくてexecになってるのは、CLIを作るライブラリとして利用したthorでrunが予約語になってて泣いたからです……。
追記: コメントで回避方法を教えてもらったのでrunで実行できるようにしました。違ってるとややこしいし。
インストール後にはEmbulkfile.lockというファイルを生成し、同じコミットを利用する様になってるはずですが、細かく動作検証してないのでバグってるかもしれない。
Embulkfileという名前とかコマンド名とかコマンドインターフェースは深く考えてないので、将来的に変える可能性もあります。