我正在编辑一个gem,其中有通常的require
命令,指向加载的gem(我正在谈论的gem称为nirvana
,其中的文件包含{{ 1}},require 'nirvana'
等等。
当我使用应用程序的bin文件(require 'nirvana/shell'
)时,我希望在其中写入的/mypath/nirvana/bin/nirvana
命令指向该gem的本地分支中的文件(我是编辑),我不想加载与经典require 'nirvana'
一起安装的原始必杀技宝石。
我不想用
替换所有gem install
命令
require 'nirvana'
...这可以解决我的问题,但它很难看!有没有办法不加载nirvana gem,并使require File.dirname(File.expand_path(__FILE__)) + '/../lib/nirvana.rb'
加载我的库(可能在$ LOAD_PATH中添加它们)?
答案 0 :(得分:3)
您可能会遇到1.9+中的require
与require_relative
难题。
require
适用于加载通过普通gems路径加载的gem,即安装在Ruby的空间中。
require_relative
适用于相对于特定文件的加载,例如,如果您正在加载您编写的模块及其在相同或子目录或您的相对目录中。
`require_relative 'some/sub/dir/to/file'`
答案 1 :(得分:2)
如果您使用的是rvm,请查看gemsets。你可以创建一个没有安装nirvana
gem的gemset,然后当你require 'nirvana'
时你只需要你的本地库,因为没有必须包含的必杀技宝石。
(我假设你正在使用ruby 1.9,好像你使用的是1.8,你可以省略require 'rubygems'
。)
答案 2 :(得分:2)
如果你是从gems二进制可执行文件中执行此操作,那么你应该只需要'nirvana.rb
一次。所以这条线只需要出现一次。看到它出现在这些文件中是很常见的。
请注意,您的示例可以更好地写为
require File.expand_path('../lib/nirvana.rb', __FILE__)
由于File::expand_path采用可选的第二个参数(目录字符串)。
许多作者还会在执行二进制文件之前将lib
目录转移到$ LOAD_PATH中,以便在尝试加载任何已安装的gem之前加载本地文件。