我正在尝试将命令行中的版本号传递给我的Capistrano上限部署脚本。我的版本号不是真正的数字或浮点数,它们是我传入的字符串。
在我的特定情况下,我正在部署我的应用程序版本7.10,但是当我将该字符串传递给我的cap命令时,Capfile会自动将其转换为7.1。我实际上有另一个实际调用cap命令的脚本。执行的cap命令类似于:
cap -f /path/to/Capfile -S domain=dev.example.com -S ssh_port=22 -S mysql_pass= -S sitename=example.com -S dbname=example-com -S drupalversion="7.10" deploy
问题是drupalversion变量以7.1的形式出现在Capfile ruby脚本中。如何保存我传入的值的字符串值?
答案 0 :(得分:3)
简短回答:在命令行中转义引号。
drupalversion=\"7.10\"
问题在于,capistrano将变量强制转换为ruby中适当的强类型变量,这在大多数情况下可能是理想的。这是执行强制的一些代码。
def coerce_variable(value)
case value
when /^"(.*)"$/ then $1
when /^'(.*)'$/ then $1
when /^\d+$/ then value.to_i
when /^\d+\.\d*$/ then value.to_f
when "true" then true
when "false" then false
when "nil" then nil
else value
end
end
您可以看到正则表达式查找引号,以便将值保存为字符串。但是,引号不是从命令行传递的,只有内容是。转义引号可确保将它们传递给ruby,然后Capistrano可以正确地将变量强制转换为字符串而不是浮点数。