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