Rake 0.8.2リリース

リリースされたのは2008/09/09なんで結構前なのだが、いまさらでも書こうと思う。リリースノートをつらつらと眺めていると、タスク引数周りがいろいろ変わっているようなので。

訂正

0.8.2の話の前に、0.8.0の記事を書いた時点で勘違いしていた点について。

タスク引数の取得方法が違う

違うというか、もっと自然な書き方ができるという話。

以前の記事では、タスク引数を参照する際、次のように配列を使う感じで書いていた。

task :build, [:version, :env] do |t, args|
  puts "Build Version: #{args[:version]}" # ココ
  puts "Environmnent: #{args[:env]}"      # ココ
end

これはこれで間違っていないのだが、プロパティっぽく書くこともできるらしい。

task :build, [:version, :env] do |t, args|
  puts "Build Version: #{args.version}"
  puts "Environmnent: #{args.env}"
end

こっちのほうが読みやすいね。ドキュメントにもこの記法で書いてあるので、こっちの書き方を利用した方がよさそう。

タスク引数の定義方法が変わっていることに気づいた人はすごい。この件については、この後すぐ。

0.8.2の追加要素

タスク引数の定義方法が変更、ついでに:needs廃止

0.8.2から、タスク引数の定義方法が変わった。

もともとは次のように定義していた。:versionと:envが引数定義である。

task :build, :version, :env do |t, args|
  ...
end

これが、次のように配列を使うスタイルになった。

task :build, [:version, :env] do |t, args|
  ...
end

従来通りの書き方でも定義できるのだが、こちらの記法が今後のスタンダードになるようだ。

これに伴い、:needsが廃止になった。タスク引数と依存タスクを両方定義したい場合、0.8.1までは依存関係の定義に:needsが必要だった。パラメータと依存タスクが一緒に書かれてしまうので、区別をつける意味でそうしてあったのだと思う。

task :build, :version, :env, :needs => :prebuild do |t, args|
  ...
end

しかし、0.8.2からの引数定義スタイルの変更により、:needsは必要なくなった。次のように書けるからである。

task :build, [:version, :env] => :prebuild do |t, args|
  ...
end

:needsは後方互換を維持するために残るが、deprecatedである。

ところで、引数の数が1つである場合はもしかして引数定義を配列にしなくてもいいかなぁ、と思って試してみたのだが、あえなくエラーになった。

タスク引数のデフォルト値設定が可能に

こんな感じで。

task :build, [:version, :env] do |t, args|

  args.with_defaults :version => "1.0", :env => "ut"

  puts "Build Version: #{args.version}"$
  puts "Environmnent: #{args.env}"$
end

with_defaultsメソッドに、引数名とデフォルト値のハッシュを渡せばよい。

$ rake build
(in /Users/idesaku)
Build Version: 1.0
Environmnent: ut
$ rake "build[1.1,ct]"
(in /Users/idesaku)
Build Version: 1.1
Environmnent: ct
$
task.clear, task.clear_prerequisites, task.clear_actions, task.reenableメソッドの追加

まぁ、タスクにこんなメソッドが追加されましたよ、という話。何ができるのかは名前から察してほしい。

rake -Tの表示が変更

rake -Tの出力は、0.8.0において80カラムより長い部分は省略されるように変更された。これが、表示時に動的にターミナルの幅を調べて適切な長さで省略するよう変更されたのだそうだ。

これはターミナルの幅が40の場合。

$ rake -T
(in /Users/idesaku)
rake db:abort_if_pending_migrations  # Raises an error ...
rake db:charset                      # Retrieves the ch...
rake db:collation                    # Retrieves the co...
rake db:create                       # Create the datab...
rake db:create:all                   # Create all the l...
rake db:drop                         # Drops the databa...

次に80の場合。

$ rake -T
(in /Users/idesaku)
rake db:abort_if_pending_migrations  # Raises an error if there are pending...
rake db:charset                      # Retrieves the charset for the curren...
rake db:collation                    # Retrieves the collation for the curr...
rake db:create                       # Create the database defined in confi...
rake db:create:all                   # Create all the local databases defin...
rake db:drop                         # Drops the database for the current R...

動的に設定されるのがイヤな場合は、環境変数RAKE_COLUMNSに任意のカラム数を設定しておくことで、表示幅を固定できる。

getoptlong使ってたのをoptparseに変えた、など他にも細々とした変更点があるのだが、まぁリリースノート参照ってことで。