【问题标题】:Passing a number string to Capistrano converts the string to a float rather than preserving the string value将数字字符串传递给 Capistrano 会将字符串转换为浮点数,而不是保留字符串值
【发布时间】:2011-12-12 19:15:18
【问题描述】:

我正在尝试将版本号从命令行传递给我的 Capistrano cap 部署脚本。我的版本号并不是真正的数字或浮点数,它们是我传入的字符串。

在我的具体情况下,我正在部署我的应用程序的 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​​ 脚本。如何保留我传入的值的字符串值?

【问题讨论】:

  • 这是一种 hack,但我为避免这种情况所做的一件事是添加一个字符串字符作为版本号的第一个字符,然后从字符串末尾的第二个字符。 set :drupal_version, drupalversion[1,5] if exists?(:drupalversion)

标签: ruby capistrano


【解决方案1】:

简答:在命令行中转义引号。

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

【讨论】:

    猜你喜欢
    • 2011-11-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多