从我们的Rails应用程序目录外的shell运行脚本中的负载gems?

时间:2014-02-27 03:49:35

标签: ruby-on-rails ruby ruby-on-rails-3 shell

我们在Rails应用程序内的vendor / cache目录中安装了一个邮件gem。

该脚本名为“test”,不在Rails应用程序目录中。

#! /usr/local/rvm/wrappers/ruby-1.9.3-p194/ruby

require 'date'
require 'fileutils'
require 'openssl'
require 'yaml'
require 'mail'
require 'dalli'

当我从Rails应用程序外部执行此脚本时,出现以下错误。

/usr/local/rvm/rubies/ruby-1.9.3-p194/lib/ruby/site_ruby/1.9.1/rubygems/custom_require.rb:36:in `require': cannot load such file -- mail (LoadError)
    from /usr/local/rvm/rubies/ruby-1.9.3-p194/lib/ruby/site_ruby/1.9.1/rubygems/custom_require.rb:36:in `require'

我只是在标准的Ruby路径中重新安装了这些宝石(mail,dalli)并且它有效,但这并不理想。

当我们尝试在Rails应用程序之外运行此脚本时,我们需要什么才能找到这些已安装的gem?换句话说,我们如何指定这些宝石的路径?

1 个答案:

答案 0 :(得分:1)

确保您的gem都在Gemfile中声明:

gem 'mail'

如果您不希望默认加载它们,并且仅在需要时加载它们,则可以使用您正在使用的require语句,并在Gemfile中添加:require => false

gem 'mail', :require => false

当您从Rails环境外部调用脚本并想加载gem时,请在bundle exec之前为脚本添加前缀:

bundle exec my_script.rb

如果您需要从rails的应用程序根目录以外的其他位置运行脚本,则必须运行:

BUNDLE_GEMFILE=/path/to/your/app/Gemfile bundle exec your_script

请注意,如果您的脚本或宝石在rails应用的路径中查找文件,这可能会导致路径问题