3

我正在使用Kernel.system我的 Rails 控制器调用 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 中修改任何环境变量?

4

2 回答 2

3

子shell 与生成它的进程具有相同的环境,所以这里发生了正确的事情,因为Bundler 用它自己的覆盖了Ruby 的加载路径,以确保只加载Gemfile 中的gem。

如果你的应用程序依赖于这个进程运行,而那个进程依赖于 twitter gem,为什么它不在你的 Gemfile 中?此外,您为什么首先在 Ruby 的子 shell 中执行 Ruby?通常没有理由你不应该在你的应用程序中使用 Ruby 代码。

于 2012-02-27T21:39:13.973 回答
1

您不应该对另一个 ruby​​ 脚本进行系统调用,您应该要求或包含另一个 ruby​​ 脚本的内容。

话虽如此,当您调用 rails 服务器时,您当前的 ruby​​gems 环境将是 rails 应用程序包的环境。如果 rails 应用程序的包不包含您的其他 ruby​​ 脚本所需的 gem,那么您的其他 ruby​​ 脚本将无法需要该库。

因此,将其他脚本抱怨它丢失的库添加到您的 rails 应用程序的 Gemfile 中,我认为应该这样做。

在您的外部 ruby​​ 脚本中尝试:

require 'bundler/setup'

取自捆绑器设置文档

于 2012-02-27T21:39:12.003 回答