Передача числовой строки в Capistrano преобразует строку в число с плавающей точкой, а не сохраняет значение строки - PullRequest
2 голосов
/ 12 декабря 2011

Я пытаюсь передать номер версии из командной строки в мой скрипт развертывания 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 входит в скрипт Ruby Capfile как 7.1. Как я могу сохранить строковое значение переданного мной значения?

1 Ответ

3 голосов
/ 24 сентября 2012

Краткий ответ: экранируйте кавычки в командной строке.

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 может корректно преобразовать переменную в строку, а не в число с плавающей точкой.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...