動かざることバグの如し

近づきたいよ 君の理想に

Rakeタスクで引数の渡し方変えたい

環境

やりたいこと

rakeタスクでは通常引数を渡したいときは

task :greet1, [:name] do |t, args|
  name = args.name
  if name
    puts "こんにちは、#{name}さん。"
  else
    puts "名前を指定してください。"
  end
end

のようにして

bundle exec rake 'greet1[taro]'

で実行する。ただ[]で囲むの面倒だし、zshの場合はさらにシングルクォーテーションで囲まないとシンタックスエラーになってしまう。

一般的な rake greet taro でスペース区切りで渡せるようにしたい

解決方法

実はrakeタスクにはデフォルトでは用意されていない。ただハックすると使える。

task :greet2 do
  if name
    # Rakeが引数を未定義のタスクだと解釈してエラーを出すのを防ぐため引数と同名のダミータスクを定義する
    task name.to_sym do ; end
    puts "こんにちは、#{name}さん。"
  else
    puts "名前を指定してください。"
  end
end

参考リンク