require
实际上是一种方法,它是Kernel#require
(调用rb_require_safe
)所以你至少可以在猴子补丁版本中执行你的hackery。如果你喜欢那种东西。
- 原始要求的别名
- 如果传递的是绝对路径,调用原来的require方法
- 否则通过创建绝对路径并调用原始 require 方法来迭代加载路径。
只是为了好玩,我对此进行了快速的抨击,原型如下。这没有经过全面测试,我还没有检查 的语义rb_require_safe
,您可能还需要查看#load
and#include
以确保完整性——这仍然是Kernel
模块的猴子补丁。它可能并不完全是可怕的,但它肯定是一个黑客。如果它比弄乱全局$:
变量好还是坏,您的电话。
module Kernel
alias original_require require
# Just like standard require but takes an
# optional second argument (a string or an
# array of strings) for additional directories
# to search.
def require(file, more_dirs=[])
if file =~ /^\// # absolute path
original_require(file)
else
($: + [ more_dirs ].flatten).each do |dir|
path = File.join(dir, file)
begin
return original_require(path)
rescue LoadError
end
end
raise LoadError,
"no such file to load -- #{file}"
end
end
end
例子:
require 'mymod'
require 'mymod', '/home/me/lib'
require 'mymod', [ '/home/me/lib', '/home/you/lib' ]