2015-10-05 100 views
1

我已经得到了需要的续集宝石的脚本:'require'<gem>''如何在没有捆绑器的情况下工作?

#!/usr/bin/env ruby 

puts "BEFORE:", $LOAD_PATH.sort 
require 'sequel' 
puts "AFTER:", $LOAD_PATH.sort 

puts self.method(:require).owner 

我希望它不使用打捆创业板的lib目录添加到负载路径失败,但它成功了!

在输出中,你可以清楚地看到的,路径是过得去的东西说:

BEFORE: 
/usr/local/lib/ruby/2.2.0 
/usr/local/lib/ruby/2.2.0/x86_64-linux 
/usr/local/lib/ruby/site_ruby 
/usr/local/lib/ruby/site_ruby/2.2.0 
/usr/local/lib/ruby/site_ruby/2.2.0/x86_64-linux 
/usr/local/lib/ruby/vendor_ruby 
/usr/local/lib/ruby/vendor_ruby/2.2.0 
/usr/local/lib/ruby/vendor_ruby/2.2.0/x86_64-linux 
AFTER: 
/usr/local/bundle/gems/sequel-4.26.0/lib 
/usr/local/lib/ruby/2.2.0 
/usr/local/lib/ruby/2.2.0/x86_64-linux 
/usr/local/lib/ruby/site_ruby 
/usr/local/lib/ruby/site_ruby/2.2.0 
/usr/local/lib/ruby/site_ruby/2.2.0/x86_64-linux 
/usr/local/lib/ruby/vendor_ruby 
/usr/local/lib/ruby/vendor_ruby/2.2.0 
/usr/local/lib/ruby/vendor_ruby/2.2.0/x86_64-linux 
Kernel 

我甚至检查方法所有者,看是否require解析为比Ruby内置的Kernel::require方法以外的东西,但它显然来自Kernel

这是怎么回事?

(使用Ruby 2.2.3。)

回答

2

这是通过RubyGems的处理,无关与捆扎机。

+0

只是做了一些测试与同时具有两种不同的版本安装了宝石的,在我的Gemfile指定一个较旧的使用需要有/无捆绑。因此,总结一下我所学到的知识:(1)ruby会自动搜索已安装的gem并添加它们的加载路径,默认为每个gem的最新安装版本,而(2)bundler将确保指定版本的路径在LOAD_PATH中是第一个,所以你得到正确的。那是对的吗? – odigity

+0

Bundler主要更改'GEM_PATH',以便RubyGems可以查看由Bundler管理的路径,类似于RVM如何更改'PATH'以便shell将查找由RVM管理的路径。 –

+0

我以为Bundler更改LOAD_PATH。当然是有的。更新:对GEM_PATH很好奇,所以我开始IRB并评估'ENV ['GEM_PATH']',并得到'nil'。然后我需要'bundler/setup'并再次评估,并得到空字符串('“”')。 – odigity

相关问题