在Ruby中,要求导入目录中的所有文件的最简洁/一行代码的方法是什么?

22

创建gem包时,我经常有以下的目录结构:

|--lib
    |-- helpers.rb
    `-- helpers
        |-- helper_a.rb
        `-- helper_b.rb

helpers.rb 内部,我只是在 helpers 目录中 require 文件。但我必须像这样做:

$:.push(File.dirname(__FILE__) + '/helpers')
require 'helper_a'
require 'helper_b'

有没有一种方法可以使这一行不需要再添加任何内容呢?我只是很快就想出了这个解决方法:

dir = File.join(File.dirname(__FILE__), "helpers")
Dir.entries(dir)[2..-1].each { |file| require "#{dir}/#{file[0..-4]}" }

但这是两行且难看的。你都用了哪些巧妙的技巧使它变成一行呢?


1
使用Dir ["/path/to/directory/*.rb"] .each {| file | require file}来要求从目录中的所有文件的最佳方法。 - Marcel Jackwerth
更好的方法是使用在那个问题中提到的require_all gem。 - clacke
4个回答

57
project_root = File.dirname(File.absolute_path(__FILE__))
Dir.glob(project_root + '/helpers/*') {|file| require file}

或者更加简洁一点:

Dir.glob(project_root + '/helpers/*', &method(:require))

我从没想过method#to_proc,太棒了! - severin
我需要理解通配符...但是+1,感谢你节省了我的时间... :D - Stefan
1
@Yasky 现在它可以了(必须在那里添加一个对absolute_path的调用) - sepp2k

3

我喜欢require_relative:

Dir.glob('lib/**/*.rb') { |f| require_relative f }

`&method(:require_relative)` 技巧对 `require_relative` 不起作用。我得到了以下结果:
`require_relative': cannot infer basepath (LoadError)

但这可以避免计算project_root的麻烦。

我正在使用ruby 2.0.0p247(2013-06-27修订41674)[x86_64-darwin12.5.0]


1
# helpers.rb
Dir[__dir__ + '/helpers/*'].each &method(:require)

0

嗨,我发现最清晰的方法是使用带通配符的Dir.glob。

在你的rakefile中加入以下内容:

gem.files = Dir.glob('lib/**/ *.rb')

它应该完美地工作。


2
这并没有回答关于使用require的问题。 - phatmann

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接