rakeでタスクを書こうとすると、引数を受け取りたい場合があります。用意されている方法は、大きく分けて2種類。しかし、どちらも正直イマイチだなと。
環境変数を使う
task :hello do
  puts "Hello, #{ENV['WORD']}!"
end
rake hello WORD=world
# => Hello, world!
タスク引数を使う
task :hello, :word do |task, args|
  puts "Hello, #{args[:word]}!"
end
rake "hello[world]"
# => Hello, world!
どちらも、呼び出し方がダサい。何とかならんかと、ちょっと無理矢理に普通の引数っぽい指定を出来るようにしてみる。
普通の引数っぽく使う
task :hello do
  puts "Hello, #{ARGV.last}!"
  ARGV.slice(1,ARGV.size).each{|v| task v.to_sym do; end}
end
rake hello world
# => Hello, world!
つまり、タスクの最後にあるARGV.slice(1,ARGV.size).each{|v| task v.to_sym do; end}を入れることで、引数名の空タスクを作ってエラーを握りつぶそうという話です。あとはARGVを自由に使えば良い。
個人的な感覚では、大分幸せになりました。
ただ、見ての通り強引なやり方なので、幾つか注意点が。
- 
rake -vTとかで見た時に引数が要ることが分からないので、descでしっかり書いておくように。
- 引数で既存のrakeタスクと同じものが指定されると、それが実行されてしまう。
自分はrakeコマンドを複数同時に実行するような使い方はしないですし、引数も全くの自由ではなく決められたリストから選ばせる形なのでOK。しかし使いどころは場面次第で。