我有一个简单的Ruby(Sinatra)服务器,该服务器从命令行ruby app.rb
启动就没有问题。但是,当我通过command line app通过`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'
。当然,Sinatra gem已安装在我的系统中;我不明白为什么解释器会表现得好像不在那里一样。
在进行故障排除时,我决定将Sinatra添加到正在调用app.rb
的命令行应用程序的Gemfile中。瞧,既然父进程可以访问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,但这没有帮助。
答案 0 :(得分:1)
自回答,因为我找到了解决方案,没有其他人回答过:
执行以下操作,而不是只执行ruby app.rb
(它本身与周围的程序在相同的环境中运行并因此使用相同的Gemfile)(忽略生成的脚本中引用的那个),而是执行:
system("BUNDLE_GEMFILE='./Gemfile' && ruby app.rb")
仅此而已!这告诉Ruby在运行程序时加载正确的gemfile。
个人笔记:非常感谢大家在上面关于问题的讨论中,以及当地的Ruby小组,我最好的朋友和我12岁的编码员儿子(实际上提供了确切的代码)。现在,我只需要弄清楚如何在不停止周围程序的情况下停止所产生的过程。不能只使用“ Ctrl-C”。但这是一个不同的问题!