embulk >= 0.9.0 から embulk gem が個別にリリースされなくなりました。
では、jruby プラグインから Embulk なライブラリを使うにはどうすれば良いかというと、embulk.jar に同梱されている embulk gem を使う形になります。
これによってどういう影響があるかというと、主には以下の2つに影響が出ているので、それについて記載します。
- embulk run -b
- jruby プラグインのテストの書き方
embulk run -b /path/to/Gemfile
embulk >= 0.9 で embulk run -b
を使いたい場合は、Gemfile に
gem 'embulk'
を書いておく必要があります。embulk < 0.9.0 では必要ありませんでした。
bundler
は Gemfile.lock に書かれているものだけをロード対象にするので、gem 'embulk'
を書いておかないと、embulk.jar に同梱されている embulk.gem でも無視されてしまいます。0.8.x 以前で書かなくて良かったのは、embulk 側でごにょごにょしてくれていたから(という認識)ですが、それは行わなくなったので、ユーザ側でケアする必要があります。
Gemfile.lock を作る際には、embulk.jar に同梱されている embulk gem を指定したいので、最終的に使いたい embulk と手元の embulk のバージョンを合わせて
$ embulk bundle update
として Gemfile.lock を作る必要があります。Gemfile.lock を覗いて、
embulk (0.9.15-java)
bundler (>= 1.10.6)
liquid (~> 4.0.0)
msgpack (~> 1.1.0)
のように embulk --version と同じバージョンの embulk gem が記載されていればOKです。
$ embulk run -b /path/to/Gemfile ...
のように -b
オプションを指定して実行すれば Gemfile を指定して embulk を実行できます。
jruby プラグインの単体テストを流す
embulk は embulk bundle exec
の利用をサポートしていないので、bundle exec rake test
でテストを実行できるようにするには手間が必要です。
embulk を .jar 拡張子付きでダウンロードしておきます。(.jar がついてないと jruby から require できません)
$ curl -o embulk.jar --create-dirs -L "http://dl.embulk.org/embulk-0.9.15.jar"
$ chmod a+x ./embulk.jar
Gemfile.lock を作る際には、embulk.jar に同梱されている embulk gem を指定したいので ./embulk.jar bundle
で依存 gem をインストールします。
$ ./embulk.jar bundle install --path vendor/bundle
embulk.jar に同梱されている jruby と bundler のバージョンを調べておきます。 See also embulk 同梱の jruby のバージョンを調べる
$ echo JRUBY_VERSION | ./embulk.jar irb
2019-08-10 00:59:11.866 +0900: Embulk v0.9.17
Switch to inspect mode.
JRUBY_VERSION
"9.1.15.0"
$ echo "require 'bundler'; Bundler::VERSION" | ./embulk.jar irb
2019-08-10 01:59:10.460 +0900: Embulk v0.9.17
Switch to inspect mode.
require 'bundler'; Bundler::VERSION
"1.17.3"
同じバージョンの jruby を rbenv なりを使ってインストールします。bundler もインストールします。embulk は embulk bundle exec
の利用をサポートしていないので、bundle exec
実行できるように同じバージョンの jruby と bundler をインストールして誤魔化そうという作戦です。
$ rbenv install jruby-9.1.15.0
$ rbenv local jruby-9.1.15.0
$ gem install bundler -v 1.17.3
bundle exec
で実行する際には、bundler が Gemfile の gem をロードする前に、embulk.jar
を require する必要があります。これは RUBYOPT
環境変数ないし、ruby の -r
オプションを利用して実現できます。
さらに以前はテストを書く時に使っていた Embulk.setup
が embulk gem >= 0.9.0 では消去されたので、代わりに embulk/java/bootstrap
を require します。
こんなかんじになると思います。
$ bundle exec ruby -r ./embulk.jar -r embulk -r embulk/java/bootstrap -e "puts Embulk"
$ bundle exec env RUBYOPT="-r ./embulk.jar -r embulk -r embulk/java/bootstrap" rake test
embulk-output-bigquery で実際にやっている設定はこちらpull/88 です。