Edited at

Rakeタスクで普通の引数っぽい処理を書く

More than 1 year has passed since last update.

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。しかし使いどころは場面次第で。