LoginSignup
19
21

More than 5 years have passed since last update.

Embulk - ソースコードリーディング No.1

Last updated at Posted at 2015-01-27

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メソッドがあります

Main.java
    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のソースコードになっていきます

Main.java
        jrubyArgs[0] = "classpath:embulk/command/embulk.rb";

に示すようにembulk.rbを次に実行します

embulk.rb

embulk.rbは以下にあります

ここでは冒頭で環境変数を取得しています

embulk.rb#1
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していますね

embulk.rb#37
require_relative 'embulk_run'

そして最後にrequireしたembulk_runのrun関数を実行しています

embulk.rb#40
Embulk.run(ARGV)

embulk_run.rb

実行時に--helpを指定していると以下のコードにかかります

embulk_run.rb#17
i = argv.find_index {|arg| arg !~ /^\-/ }
usage nil unless i

ここでusage関数が実行されます
正規表現を見ればわかると思いますが--helpじゃなく、--helだったり--hogeでもヘルプが表示されます

ちなみに--helpと一緒に定義されていないオプションを指定すると、unlessではなく後続のエラー処理にかかります
その場合はusage関数にはnilではなく、エラーメッセージが渡され、helpの文言の後にエラーメッセージが表示されます

そしてusage関数内のputsでメッセージが表示されるということになります

embulk_run.rb#225
  def self.usage(message)
    STDERR.puts "usage: <command> [--options]"
    STDERR.puts "commands:"
    (省略)

ひとまずhelpまで読んでみました

私は伝統的なSIをやっている企業に所属しているものなのでこういうrubyのコードを読むのが新鮮で、楽しくてたまりませんので引き続きコードリーディングを続けたいと思います

19
21
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
19
21