Vargrantfile - Ruby - неожиданный конец файла - PullRequest
0 голосов
/ 16 февраля 2019

Я новичок в рубине.Я пытался изменить существующий файл Vargrantfile, который имеет синтаксис ruby.У меня ниже

def has_program(program)
  ENV['PATH'].split(File::PATH_SEPARATOR).any? do |directory|
    File.executable?(File.join(directory, program.to_s))
  end
end 

is_exist = has_program("some-command")
puts is_exist
$my_script = %{
if is_exist == false
  if ! some-command status; then
    #Do some staff
  fi
end
# do some staff
}

Vagrant.configure("2") do |config|

   node.vm.provision "shell", inline: $my_script
end

Затем во время работы vagrant up --provision я получаю ошибку ниже

syntax error: unexpected end of file

Можете ли вы сообщить мне, какую ошибку я делаю?

С уважением, -M-

1 Ответ

0 голосов
/ 16 февраля 2019

Это синтаксическая ошибка, но не одна в вашем коде Ruby как таковая.Это незавершенное утверждение в коде оболочки, которое вы выполняете из сценария Ruby.

Это может произойти, если вы оставите блок закрытым.Парсер ожидает найти его конец, но встречает конец сценария.

Давайте посмотрим на ту часть, где вы выполняете команду оболочки

$my_script = %{
if is_exist == false
  if ! some-command status; then
    #Do some staff
  fi
end
# do some staff
}

Теперь давайте разберем Rubyчасти у вас есть вокруг него.Назначение $my_script = по-прежнему является кодом Ruby.Часть в фигурных скобках - это строковый литерал в нотации % , который вы позже выполняете как скрипт оболочки, используя inline Vagrant. Однако, похоже, что вы переключаетесьвернуться к синтаксису Ruby перед окончанием строкового литерала.

То, что интерпретатор анализирует как сценарий оболочки, такова:

if is_exist == false
  if ! some-command status; then
    #Do some staff
  fi
end
# do some staff

Обратите внимание, что все внешнее выражение if использует Ruby's if синтаксис.Это недопустимая команда оболочки, поэтому ошибка.

Я не уверен, какова семантика этого выражения в вашем случае, но вам нужно преобразовать его в оболочку if или переместить его за пределы строкибуквально вы переходите к Vagrant, используя опцию inline.С другой стороны, логика внутри кажется странной.Вы звоните some-command, если has_program("some-command") возвращает false.Но это отдельная история:)

...