Rakeのタスクに引数が取れるようになったけど…ひどい
Rakeはバージョン0.8.0からタスクに引数が取れるようになった。タスクの引数はいろんな人から要望があったと思う。
http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-list/44366
http://wiki.fdiary.net/rails/?RakeImprovementProject
まだドキュメントができていないので自分なりに調べてみた。こんな感じに使うようだ。
以下の例ではタスクfooの引数foo, barを定義し、タスクbazの引数にfooを定義する。
taskメソッドの引数にはタスクの引数も取れるようになっている。それにともない、タスクの引数と依存関係を一気に宣言するにはbazタスクのように「:needs=>依存」と指定する。
で、taskブロックの第二引数がRake::TaskArgumentsオブジェクトになっているので、そこからタスク引数アクセスする。Rake::TaskArgumentsはタスク引数へのアクセスと環境変数へのアクセスを統合している。
desc "foo task" task :foo, "foo", "bar" # タスク引数foo, bar task :foo => :bar do |x,y| x.set_arg_names ["foo"] p y.class p y.hoge # タスク引数ではないので環境変数を読む puts "Arguments: foo=#{y.foo} bar=#{y.bar}" # タスク引数を読む end desc "baz task" task :baz, "foo", :needs => :bar do |x,y| # タスク引数foo。barに依存。 puts "Arguments: foo=#{y.foo}" end task :bar do puts "bar" end
ここまではいいんだ。かっこいいDSLだ。
だが、ここからがひどい。
タスク引数はコマンドラインで 「taskname[arg1,arg2,...]」と指定する。zshだとquoteしないといけないから使いづらい。なんとかならんかね。クオートとかぶらない文字の選択肢はなかったものか。「noglob」をつければquote不要だけどいちいちつけるのが面倒だし嫌だ。「taskname@arg1,arg2」とかのほうがいいな。「alias rake='noglob rake'」はなんか不気味だ。
しかも「rake foo foo=1 bar=2 hoge=3」と環境変数経由で引数をセットしても引数と認められない仕様が特にひどい。これはハマる。
クオート問題もあわせてこれじゃあ全く萌えない。せめて環境変数経由での引数の指定ができれば…
$ rake -T (in /tmp) rake baz[foo] # baz task rake foo[foo,bar] # foo task $ rake 'foo[1,2]' (in /tmp) bar Rake::TaskArguments nil Arguments: foo=1 bar=2 $ rake 'baz[1,2]' 'foo[3,4]' (in /tmp) bar Arguments: foo=1 Rake::TaskArguments nil Arguments: foo=3 bar=4 $ rake foo foo=1 bar=2 hoge=3 (in /tmp) bar Rake::TaskArguments "3" Arguments: foo= bar=