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