Запустите приложение Ruby, развернутое в комплекте, за пределами своего собственного каталога?
Я в процессе написания демона на основе Ruby, чтобы сидеть и работать на одном из моих серверов Ubuntu. Мне будет нужно, чтобы это запускалось при запуске, так что он будет писать для него файл стартовой работы. Тем не менее, я использовал диспетчер для управления различными драгоценными камнями, которые он использует, и намерен сделать это после его развертывания на сервере:
bundle install --deployment
Это ставит бункер в так называемый "режим развертывания", в котором устанавливаются различные параметры, и все драгоценные камни устанавливаются в каталог "поставщик", а не в общесистемный. Однако это создает проблему с запуском, в результате чего он должен выполняться из своего собственного каталога, так как в этом случае камни заканчиваются:
<in the app dir>
$ ./runmyapp
<it runs>
Если я cd
в другое место, а затем попытайтесь запустить его, используя полный путь, он не работает:
<in another directory>
$ /path/to/runmyapp
<it crashes as it can't locate its gems>
Я прочитал много документации о комплектенике, и весь этот сценарий никогда не рассматривается? Должен ли я просто установить драгоценные камни в систему? Есть ли что-то еще, что я должен делать?
Ответы
Ответ 1
Вы используете диспетчер gem для своего приложения. Я думаю, что в этом случае использование bundle exec
- лучший способ запуска исполняемых файлов.
Если вы запустите свое приложение из другого каталога, кроме каталога, содержащего Gemfile, вы должны установить местоположение Gemfile, установив BUNDLE_GEMFILE (см. bundle help exec
). Следующее поможет вам:
BUNDLE_GEMFILE=/path/to/Gemfile bundle exec /path/to/runmyapp
Ответ 2
Решая подобную проблему самостоятельно, я в итоге создал скрипт-обертку,
#!/bin/bash
BUNDLE_GEMFILE="$(dirname $0)"/Gemfile bundle exec ruby "$(dirname $0)"/app.rb $*
Здесь app.rb
находится "главная" точка входа приложения. Вы можете вызвать скрипт-обертку runmyapp
или имя приложения или что-то еще.
Примечание: $0
устанавливается bash в расположение файла сценария оболочки, например, /home/foo/app/runmyapp
или ./runmyapp
bundle exec
"выполняет команду, делая все гемы, указанные в Gemfile, доступными для использования в программах Ruby". (документы)