ruby - 当相同的命令在命令行上运行时,如何通过 Ruby shell 命令运行应用程序
问题描述
我有一个简单的 Ruby (Sinatra) 服务器,它可以从命令行启动而没有问题ruby app.rb
。但是当我通过我的命令行应用程序执行相同的命令时,无论是 with`ruby app.rb`
还是 with 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
. 瞧,现在父进程可以访问 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,但这没有帮助。
解决方案
自我回答,因为我找到了解决方案,没有其他人回答过:
而不是执行 just ruby app.rb
,它本身在与周围程序相同的环境中运行,因此使用相同的 Gemfile(忽略生成的脚本中提到的那个),执行:
system("BUNDLE_GEMFILE='./Gemfile' && ruby app.rb")
这就是它的全部!这告诉 Ruby 在运行程序时加载正确的 gemfile。
个人说明:非常感谢以上讨论中关于这个问题的所有人,以及当地的 Ruby 小组、我最好的朋友和我 12 岁的程序员儿子(他实际上提供了确切的代码)。现在我只需要弄清楚如何在不停止周围程序的情况下停止生成的进程。不能只使用“Ctrl-C”。但这是一个不同的问题!
推荐阅读
- scheme - 方案中的配对组合
- android - 由于 Intent Service 已被弃用,如何在 kotlin 中使用 Job Intent Service 编写此代码?
- flutter - Flutter/Dart:get_cli 向页面添加更多控制器
- flutter - 当我尝试再次登录时,我收到此错误:- 在 null 上调用了 getter 'uid'
- java - 我想更改 Java Swagger 中的 http 标头 User-Agent。请帮我
- python - odoo 14 如何获取用户硬件信息进行健康监测
- python - Django AbstractBaseUser Authentication-Login
- spring-boot - 使用 Spring Boot 在模式注册表中注册模式
- java - 如何将以下类型的复杂json响应映射到java模型类
- flutter - 带有 CupertinoTabView 的 CustomScrollView 导致列表实体被覆盖