Capistranoのタスク名に応じて動作を変える

Capistranoで実行中のタスクにはcurrent_taskでアクセスできる。これを使うと、タスク名に応じて挙動を変えるというようなこともできる。以下はRubyをインストールするためのスケルトン(のつもり)。

task :real_install_ruby do
  run "echo installing ruby #{install_ruby_version}..."
  # ...
  run "echo done"
end

def install_ruby_by_task(task)
  unless /_(\d_\d_\d)(?:_(p\d+))?$/ =~ task.name.to_s
    raise Error,
      "unexpected taskname: #{task.fully_qualified_name}"
  end

  pl = $2 ? "-#{$2}" : ''
  verstr = $1.split(/_/, 3).join('.') + pl
  set :install_ruby_version, verstr
  real_install_ruby 
end

task :install_ruby_1_8_7_p72 do
  install_ruby_by_task(current_task)
end

ある程度は実装に踏み込んでいることになってしまうので、多用すると後ではまるかもしれない。