2008年 01月 08日

Rake タスクの引数のほげほげ

http://d.hatena.ne.jp/rubikitch/20080107/rakeargs をみてて、使えるようになったノカーとか思いつつ、このままだとちょっと使えないなぁと思ったので、Rakefile で対応できる範囲でつかいやすくしてみた

def args(hash)
	name = hash.keys.first
	args = hash[name]
	task name, *args
end

desc "foo task"
args :foo => [:bar, :baz]
task :foo do |t,a|
	p t.arg_names
	p a.bar
	p a.baz
end

desc "bar task"
task :bar do |t|
	puts "this is bar."
end

# ARGV は Rakefile が実行される時には既に rake 自体への引数は全てとりのぞかれている
Rake.application.top_level_tasks.replace(ARGV.map {|a|
	name, vals = *a.split(/@/, 2)
	vals ? "#{name}[#{vals}]" : a
})

これで

$ rake 'foo[aaa,bbb]'
(in /Users/cho45/tmp)
[:bar, :baz]
"aaa"
"bbb"

$ rake foo@aaa,bbb
(in /Users/cho45/tmp)
[:bar, :baz]
"aaa"
"bbb"

になって、どっちでもいけるようになる。


あと引数の宣言の DSL がめちゃくちゃわかりにくいと思うのでオレオレメソッドを定義してみた (あの DSL で、後ろに書いてあるのが引数だと想像できる人はどれほどいるんだろう……)。先に args の宣言がくるのはちょっとキモいけど、task メソッドうわがきせずやるとこんなもんなのかなぁ。


でもそんなに引数めちゃくちゃとりたいケースってないのかもしれない……

いまさらだけど別に ARGV みなくても top_level_tasks.map! でいいのだった。(最初は ARGV をもっといじくるコードを書いてたなごり)