Treasure DataよりEmbulkというOSSが発表されました
(詳細:http://www.slideshare.net/frsyuki/embuk-making-data-integration-works-relaxed)
このOSSはFluentdを開発された古橋さんが携わっており、「バッチ版のFluentd」と呼べるSWです
Fluentdはストリームでデータ連携を実施しますが、こちらはバッチ処理にて同様にデータ連携を行います
※もちろんFluentdと同様にプラグインで拡張
非常に面白く将来的に流行りそう&仕事で早く使いたいというのもありソースコードリーディングを始めました
当Blogでは備忘がてら内容を記載していきたいと思います
今日のリーディング範囲
手始めに以下のコマンドで表示されるhelpまでとします
java -jar embulk.jar --help
リーディング内容
githubリポジトリ
まずembulkのgithubリポジトリは下記にあります
mainメソッド
コマンドを見てわかるようにembulkはJavaですので起動の起点となるmainメソッドがあります
public static void main(String[] args)
{
// TODO set GEM_HOME to point the internal gem repository created by gem-maven-plugin?
// $ java -jar jruby-complete.jar classpath:embulk/command/embulk.rb "$@"
String[] jrubyArgs = new String[args.length + 1];
jrubyArgs[0] = "classpath:embulk/command/embulk.rb";
System.arraycopy(args, 0, jrubyArgs, 1, args.length);
org.jruby.Main.main(jrubyArgs);
}
ここで重要なのはjrubyをCallしているというところですね
つまりここからRubyのソースコードになっていきます
jrubyArgs[0] = "classpath:embulk/command/embulk.rb";
に示すようにembulk.rbを次に実行します
embulk.rb
embulk.rbは以下にあります
ここでは冒頭で環境変数を取得しています
bundle_path = ENV['EMBULK_BUNDLE_PATH'].to_s
bundle_path = nil if bundle_path.empty?
この環境変数はembulk_generate_bin.rbで設定しているようですが、通っていないのでここではnilになるのでしょう
でnilだと以下のコードで同一階層のembulk_run.rbをrequireしています
#ちなみに上記環境変数に値がある場合は絶対パスでrequireしていますね
require_relative 'embulk_run'
そして最後にrequireしたembulk_runのrun関数を実行しています
Embulk.run(ARGV)
embulk_run.rb
実行時に--helpを指定していると以下のコードにかかります
i = argv.find_index {|arg| arg !~ /^\-/ }
usage nil unless i
ここでusage関数が実行されます
正規表現を見ればわかると思いますが--helpじゃなく、--helだったり--hogeでもヘルプが表示されます
ちなみに--helpと一緒に定義されていないオプションを指定すると、unlessではなく後続のエラー処理にかかります
その場合はusage関数にはnilではなく、エラーメッセージが渡され、helpの文言の後にエラーメッセージが表示されます
そしてusage関数内のputsでメッセージが表示されるということになります
def self.usage(message)
STDERR.puts "usage: <command> [--options]"
STDERR.puts "commands:"
(省略)
〆
ひとまずhelpまで読んでみました
私は伝統的なSIをやっている企業に所属しているものなのでこういうrubyのコードを読むのが新鮮で、楽しくてたまりませんので引き続きコードリーディングを続けたいと思います