我正在使用我的Rails控制器中的Kernel.system
调用shell脚本。 shell脚本可能会根据某些条件调用另一个Ruby脚本。这个Ruby脚本需要twitter gem。我的Rails应用程序使用Passenger在apache中运行。现在,当从我的Rails应用程序调用此Ruby脚本时,我在apache日志中收到以下错误。
/var/www/webapps/test/twitter/twitter_post.rb:2:in `require': no such file to load -- twitter (LoadError)
from /var/www/webapps/test/twitter/twitter_post.rb:2
同样的Ruby脚本在Linux shell中运行良好。现在,如果我在我的Gemfile中列出twitter gem,它就能完美运行。 Kernel.system
应该调用子shell中的命令,Rails是否在其执行shell中修改任何环境变量?
答案 0 :(得分:3)
子shell与生成它的过程具有相同的环境,因此正确的事情发生在这里,因为Bundler用自己的负载路径覆盖了Ruby的加载路径,以确保只加载Gemfile中的gem。
如果您的应用程序依赖于此进程运行,并且该进程取决于twitter gem,为什么它不在您的Gemfile中呢?此外,为什么你首先在Ruby的子shell中执行Ruby?通常没有理由不在您的应用程序中使用Ruby代码。
答案 1 :(得分:1)
你不应该对另一个ruby脚本进行系统调用,你应该要求或包含其他ruby脚本的内容。
话虽这么说,当你调用rails服务器时,你当前的rubygems环境将是rails应用程序捆绑的环境。如果rails应用程序的bundle不包含你的其他ruby脚本所需的gem,那么你的其他ruby脚本将无法要求该库。
所以,在你的rails应用程序的Gemfile中添加另一个脚本抱怨它丢失的库,我认为应该这样做。
在外部ruby脚本中尝试:
require 'bundler/setup'