capistrano で引数から設定した値が定義済みかどうか確認する

capistranoコマンドラインから値を渡すのに -S foo=bar のようにしますが、この値が定義されているかどうかを確認したくて defined? してみたものの常に未定義になる。でも値は取れる。

# config/deploy.rb
if defined? foo
  puts "foo is defined. foo=#{foo}"
else
  puts "foo is not defined. foo=#{foo}"
end
$ cap -S foo=bar
foo is not defined. foo=bar

capistrano/configuration/variables.rb あたりをみてみたら、-S (-s) で定義したものは変数ではなく、method_missing で拾われて値を返しているようですね。

exists? というメソッドがあるので、それに変数名ではなくシンボルを渡すことで存在チェックが可能でした。

if exists? :foo
  puts "foo is defined. foo=#{foo}"
else
  puts "foo is not defined. foo=#{foo}"
end