请记住,当您require
通过某个路径多次识别文件时,每个后续调用都require
将返回false
,并且不会重新评估该文件。因此,如果您的base.rb
(即require
其他所有内容)本身就是require
d,则进一步尝试require
它不应导致重新评估。
让我们用一个例子来演示它。创建一个lib
包含 3 个文件的目录。
# lib/a.rb
require 'base'
puts :a
# lib/b.rb
require 'base'
puts :b
# lib/base.rb
$counter ||= 0
puts "Evaluated base.rb #{$counter += 1} times"
dir = File.dirname(__FILE__)
path = File.join(dir, '**', '*.rb')
Dir[path].each { |file| require File.expand_path file }
直接执行lib/base.rb
。base.rb
将被评估两次:首先,当它直接执行时;其次,当它是require
d 时a.rb
。请注意,当它需要从b.rb
.
$ ruby -I lib lib/base.rb
Evaluated base.rb 1 times
Evaluated base.rb 2 times
a
b
比较require
一下。Nowbase.rb
只评估一次,因为尝试在require
它a.rb
之前使用命令行开关b.rb
让文件d 进入它。require
-r
$ ruby -I lib -r base -e 'puts :ok'
Evaluated base.rb 1 times
a
b
ok