寸阳分阴须爱惜,休负春色与时光。这篇文章主要讲述如何在命令行上使用相同的命令,通过Ruby shell命令运行app相关的知识,希望能为你提供帮助。
我有一个简单的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] INFOWEBrick 1.3.1
[2018-12-18 23:17:37] INFOruby 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] INFOWEBrick::HTTPServer#start: pid=27384 port=4567
所以我必须按Ctrl-c退出命令行应用程序。
问题:有没有办法生成一个独立的Sinatra进程/服务器,因为我试图用
system("ruby app.rb")
,而不是在父应用程序(命令行应用程序)中安装它?我也尝试使用Process.fork,然后使用Process.wait,但这没有帮助。答案自我回答,因为我找到了解决方案,没有其他人回答:
而不是只执行
ruby app.rb
,它本身在与周围程序相同的环境中运行,因此使用相同的Gemfile(忽略生成的脚本中引用的那个),执行:system("BUNDLE_GEMFILE='./Gemfile' &
&
ruby app.rb")
这就是它的全部!这告诉Ruby在运行程序时加载正确的gemfile。
【如何在命令行上使用相同的命令,通过Ruby shell命令运行app】个人提示:非常感谢大家在讨论,上面,问题,以及当地的Ruby小组,我最好的朋友和我12岁的编码员儿子(实际提供了确切的代码)。现在我只需要弄清楚如何在不停止周围程序的情况下停止生成的进程。不能只使用“Ctrl-C”。但这是一个不同的问题!
推荐阅读
- 如何在Android和iPhone的移动应用程序中实现推荐计划
- 为什么`android(foreground`属性不起作用())
- 如何在android表格布局中合并两行
- 如何将xml文件保存在我想要的目录中(android studio)[关闭]
- 应用程序图标缺失/未出现android studio
- Android资源链接失败('à¥?dp'与属性layout_marginBottom(attr)维度不兼容)
- 将形状添加到LinearLayout Android
- 如何将IStringLocalizer注入IApplicationModelConvention()
- 考虑在配置中定义类型为“com.gisapp.gisapp.dao.IUserDAO”的bean