Rake の CLI 引数の文法(syntax)

Published: 2023/9/7


rake は、タスクに対する引数を [] を用いて記述したり、ENV の設定値を引数から与えたり、などができる。

$ rake somevar=hoge 'some_task[arg1, arg2]'

上記は、 ENV['somevar'] = "hoge" としながら、 some_task という rake task を、 ["arg1", "arg2"] の引数で起動せよ、という記述になる。

CLI から実行されるコマンドであるので、そのオプションでない引数の処理がどうなっているのか、例だけを見てもいまいち自明ではなかったので、ソースコードを追ってみた際の備忘録。

バージョン

v13.0.6

処理内容

  1. プログラム引数から、オプション引数たちを抜き出す。オプションじゃなかった残りの引数について、引数処理を継続する。
  2. プログラム引数が /^\w+=/ にマッチするとき、 ENV への代入引数とみなして設定する。そうでない場合、タスク引数としての処理にまわす。
  3. 引数の先頭以外の場所に [ の文字が存在し、かつ、引数の末尾が ] である場合に限り、タスク引数の特殊処理を開始する。その形式をしていない引数は、全体がタスク名であり、タスク引数はなし([])である、と解釈する。そうでない場合、後続の処理で判定する。
  4. 引数の先頭文字ではない最初の [ 文字によって、タスク文字列[引数文字列] として引数を分解し、タスク文字列 をタスク名とする。
  5. 引数文字列 が空であれば、タスク引数はなし([])であるとする。そうでなければ後続する。
  6. 引数文字列をタスク引数配列としてパースする。 \文字 はただの特殊処理を行わない、タスク引数として与えられていく文字を表すものとして考えた上で、
    1. 特殊文字としての , を見つけだし、そこで引数文字列を分割していく。
    2. 分割された各パーツの、先頭と末尾の \ エスケープされていない空白系文字(\s)任意個数を省いて、それをタスク引数とする。
      • \ でエスケープされていない , の数 + 1 個のタスク引数が生成される。
    3. (該当処理: https://github.com/ruby/rake/blob/5c60da8644a9e4f655e819252e3b6ca77f42b7af/lib/rake/application.rb#L175 )

感想

日本語等の自然言語で説明するより、 ruby のコードと正規表現を読め、という rake 開発者の意思を感じた。


Tags: rakeruby

関連記事