Как запустить приложение с помощью команды оболочки Ruby, когда та же команда работает в командной строке - PullRequest
0 голосов
/ 19 декабря 2018

У меня есть простой сервер Ruby (Sinatra), который запускается без проблем из командной строки с ruby app.rb.Но когда я выполняю ту же команду через мое приложение командной строки , либо с `ruby app.rb`, либо с system("ruby app.rb"), я получаю эту ошибку:

app.rb:1:in `require': cannot load such file -- sinatra (LoadError)
    from app.rb:1:in `<main>'

Открывающая строка app.rb это просто require 'sinatra'.Конечно же, в моей системе установлен камень Синатры;Я не понимаю, почему интерпретатор действует так, как будто его там нет.

При устранении неполадок я решил добавить Синатру в Gemfile приложения командной строки, которое вызывает app.rb.И вот, теперь, когда родительский процесс имеет доступ к Sinatra, теперь он работает (то есть, system(app.rb) успешно запускает сервер Sinatra).Но когда я выхожу из приложения командной строки, сервер Sinatra всегда там, говоря:

[2018-12-18 23:17:37] INFO  WEBrick 1.3.1
[2018-12-18 23:17:37] INFO  ruby 2.4.0 (2016-12-24) [x86_64-linux]
== Sinatra (v2.0.4) has taken the stage on 4567 for development with backup from WEBrick
[2018-12-18 23:17:37] INFO  WEBrick::HTTPServer#start: pid=27384 port=4567

Поэтому мне нужно Ctrl-c, чтобы выйти из приложения командной строки.

Вопрос:есть способ порождать независимый процесс / сервер Sinatra, как я пытался сделать с system("ruby app.rb"), не устанавливая его в родительское приложение (приложение командной строки)?Я также пытался использовать Process.fork, а затем Process.wait, но это не помогло.

1 Ответ

0 голосов
/ 07 января 2019

Ответил сам, так как я нашел решение, и никто больше не ответил на него:

Вместо выполнения просто ruby app.rb, которое само по себе работает в той же среде, что иОкружая программу и, следовательно, используя тот же Gemfile (игнорируя тот, который указан в порожденном скрипте), выполните:

system("BUNDLE_GEMFILE='./Gemfile' && ruby app.rb")

Это все, что нужно было!Это говорит Ruby загружать правильный gemfile при запуске программы.


Личное примечание: Большое спасибо всем вам в обсуждении выше, а также по этому вопросукак местная группа Ruby, мой лучший друг и мой 12-летний сын кодера (который фактически предоставил точный код).Теперь мне просто нужно выяснить, как остановить порожденный процесс, не останавливая окружающую программу.Не могу просто использовать "Ctrl-C".Но это другая проблема!

...