Переопределить ENV['HOME'] для разработки приложения командной строки Ruby

Я создаю приложение командной строки Ruby со следующими характеристиками:

  • Он использует структуру GLI.
  • Приложение использует переменную ENV['HOME'] для пути к домашнему каталогу пользователя.
  • Файл конфигурации хранится в домашнем каталоге пользователя.
  • Приложение будет развернуто в рабочей среде как Gem.
  • Разработка выполняется на той же машине, на которой приложение используется в производстве.
  • Комбинация Cucumber, RSpec и запуска приложения через bundle exec bin/app_name используется для тестирования сценария в разработке.

Приложение манипулирует файлами. Моя цель — убедиться, что экземпляр разработки работает только в своей собственной среде разработки/тестирования. Я считаю, что хорошим подходом является переопределение ENV['HOME'], когда скрипт запускается для разработки.

Есть ли способ переопределить переменную ENV['HOME'], чтобы независимо от того, как, всякий раз, когда сценарий запускается в своем каталоге разработки, он не использовал фактический путь ENV['HOME']?


person Alan W. Smith    schedule 26.05.2014    source источник
comment
Вы имеете в виду способ определить, является ли сценарий версией разработки или нет?   -  person matt    schedule 26.05.2014
comment
@matt, это часть уловки, которую я пытаюсь понять. (Я относительно новичок в таких вещах в Ruby.) Я думаю, что мог бы иметь файл, который действует как переключатель, который существует в разработке, но не развернут в рабочей среде. Сейчас я работаю над экспериментами с таким подходом.   -  person Alan W. Smith    schedule 26.05.2014


Ответы (1)


Я бы сделал это таким образом, чтобы исключить какие-либо специфические для разработки вещи из фактического кода приложения, но иметь Rakefile для тестирования во время разработки. Там вы можете убедиться, что среда настроена правильно, например:

desc "Run the app"
task :exec do
  ENV['HOME']= "somewhere else"
  exec "./bin/your_binary"
end

Затем вы должны запустить rake exec (или дать задаче лучшее имя), чтобы запустить версию для разработки, в то же время имея возможность запускать настоящую версию. Если вы сохраните свой каталог разработки bin в своем PATH, не должно быть никаких шансов перепутать две команды.

Если вы хотите иметь возможность напрямую запускать разрабатываемую версию, вы можете использовать тот факт, что при запуске двоичного файла gems фактический исполняемый файл является файлом-оболочкой, который создает Rubygems. Вы можете проверить это с помощью идиомы __FILE__ == $0 в верхней части исполняемого файла:

if __FILE == $0
  # executing directly, probably in dev environment
  ENV['HOME'] = "somewhere else"
end

При непосредственном вызове вашего файла среда будет заменена, при вызове установленного драгоценного камня $0 будет файлом-оболочкой, поэтому будет использоваться исходная среда.

«Обычный» способ сделать это — просто установить среду из вашей оболочки, например. в Баше:

$ HOME='somewhere else' ./bin/the_executable

Опасность здесь, конечно, заключается в том, что вы можете забыть установить среду, в результате чего некоторые из ваших файлов будут уничтожены. Вы можете обойти это, установив новую среду для всего вашего видения:

$ export HOME='somewhere else'
$ ./bin/the_executable

но это, вероятно, повлияет на другие инструменты, использующие HOME, поэтому это не рекомендуется.

Я бы посоветовал выбрать вариант Rakefile с параметром __FILE == $0 в качестве второго варианта.

person matt    schedule 26.05.2014
comment
Я работаю над этим подходом. Кроме того, в некоторых случаях я добавляю проверку файла, который существует только в среде разработки. Это фактически переключатель уничтожения, если этот файл существует, а ENV['HOME'] не был обновлен. Если я случайно не активирую его какое-то время, я его удалю, но пока мне нравится идея дополнительного уровня защиты от самого себя, когда я изучаю Ruby. - person Alan W. Smith; 28.05.2014