Ruby on rails 在Rails应用程序目录之外的shell中运行的脚本中加载gems?

Ruby on rails 在Rails应用程序目录之外的shell中运行的脚本中加载gems?,ruby-on-rails,ruby,ruby-on-rails-3,shell,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/l

我们在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路径中重新安装了这些gems(mail、dalli),并且工作正常,但这并不理想


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

请确保您的gem都在您的gem文件中声明:

gem 'mail'
如果您不希望在默认情况下加载它们,并且仅在需要时加载它们,则可以使用您已经在使用的
require
语句,并在GEM文件中添加
:require=>false

gem 'mail', :require => false
当您从Rails环境外部调用脚本并希望加载gems时,请使用
bundle exec
作为脚本前缀:

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

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

请记住,如果您的脚本或gems正在rails应用程序的路径中查找文件,这可能会导致路径问题

是否也要加载rails环境?我确实不需要加载rails环境,但如果这样可以解决问题,我不介意添加它。如何通过脚本加载rails环境?我的脚本不是ruby脚本。使用bundle exec从外部rails环境执行脚本时出现此错误“找不到Gemfile”。您的脚本是ruby脚本,因为它以
#开头/usr/local/rvm/wrappers/ruby-1.9.3-p194/ruby
(即使没有
.rb
扩展)。2个问题:您是否运行了
捆绑安装
?启动脚本时,您是否处于rails应用程序的根目录中?是的,我已经运行了bundle安装,我的rails应用程序也运行得很好。不,我不是从rails应用程序的根目录执行脚本。如果我从rails应用程序的根目录执行脚本,效果会非常好。但我希望脚本可以在任何地方执行。这是一个很好的发现。gem位于应用程序的本地路径中,因此不是全局路径,因此需要从应用程序根目录运行它。我不确定我们能否解决这个问题,但我们可以尝试:
BUNDLE\u GEMFILE=/path/to/your/app/GEMFILE BUNDLE exec your\u script
(从您选择的位置执行)