将数字字符串传递给Capistrano会将字符串转换为浮点数而不是保留字符串值

时间:2011-12-12 19:15:19

标签: ruby capistrano

我正在尝试将命令行中的版本号传递给我的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​​脚本中。如何保存我传入的值的字符串值?

1 个答案:

答案 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可以正确地将变量强制转换为字符串而不是浮点数。