当同一命令在命令行上运行时,如何通过 Ruby shell 命令 运行 应用程序
How to run app via Ruby shell command, when same command works on command line
我有一个简单的 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 process/server,就像我尝试用 system("ruby app.rb")
做的那样,而无需将其安装在父应用程序(命令行应用程序)中?我也尝试使用 Process.fork,然后使用 Process.wait,但这没有帮助。
自我回答,因为我找到了解决方案,但没有其他人回答:
与其只执行 ruby app.rb
,它本身运行在与周围程序相同的环境中,因此使用相同的 Gemfile(忽略生成脚本中引用的那个),而是执行:
system("BUNDLE_GEMFILE='./Gemfile' && ruby app.rb")
仅此而已!这告诉 Ruby 在运行程序时加载正确的 gemfile。
个人说明: 非常感谢在上面讨论问题的所有人,以及本地 Ruby 组,我最好的朋友,和我 12 岁的编码员儿子(他实际上提供了确切的代码)。现在我只需要弄清楚如何在不停止周围程序的情况下 停止 生成的进程。不能只使用 "Ctrl-C." 但那是另一个问题!
我有一个简单的 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 process/server,就像我尝试用 system("ruby app.rb")
做的那样,而无需将其安装在父应用程序(命令行应用程序)中?我也尝试使用 Process.fork,然后使用 Process.wait,但这没有帮助。
自我回答,因为我找到了解决方案,但没有其他人回答:
与其只执行 ruby app.rb
,它本身运行在与周围程序相同的环境中,因此使用相同的 Gemfile(忽略生成脚本中引用的那个),而是执行:
system("BUNDLE_GEMFILE='./Gemfile' && ruby app.rb")
仅此而已!这告诉 Ruby 在运行程序时加载正确的 gemfile。
个人说明: 非常感谢在上面讨论问题的所有人,以及本地 Ruby 组,我最好的朋友,和我 12 岁的编码员儿子(他实际上提供了确切的代码)。现在我只需要弄清楚如何在不停止周围程序的情况下 停止 生成的进程。不能只使用 "Ctrl-C." 但那是另一个问题!