要求Ruby目录中所有文件的最干净/单线方法?

Posted

技术标签:

【中文标题】要求Ruby目录中所有文件的最干净/单线方法?【英文标题】:Cleanest/One-liner way to require all files in directory in Ruby? 【发布时间】:2011-01-30 02:35:52 【问题描述】:

在创建gem时,我经常有这样的目录结构:

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

helpers.rb 中,我只是require-ing helpers 目录中的文件。但我必须这样做:

$:.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]" 

但它是两条线而且很丑。你做了什么巧妙的技巧来使它成为一个单衬里?

【问题讨论】:

重复***.com/questions/735073/… - 使用Dir["/path/to/directory/*.rb"].each |file| require file 更好的是,使用该问题中提到的 require_all gem。 【参考方案1】:
project_root = File.dirname(File.absolute_path(__FILE__))
Dir.glob(project_root + '/helpers/*') |file| require file

或者打更多的高尔夫球:

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

【讨论】:

我不会想到方法#to_proc,很好! 我需要了解通配符...但是 +1 并感谢您为我节省的时间...:D @Yasky 没有,但现在可以了(必须在那里拨打absolute_path【参考方案2】:

我喜欢 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 revision 41674) [x86_64-darwin12.5.0]

【讨论】:

【参考方案3】:
# helpers.rb
Dir[__dir__ + '/helpers/*'].each &method(:require)

【讨论】:

【参考方案4】:

您好,我发现的最简洁的方法是将 Dir.glob 与通配符一起使用。

将以下内容放入您的 rakefile:

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

它应该是一种享受。

【讨论】:

这没有回答关于使用require的问题。

以上是关于要求Ruby目录中所有文件的最干净/单线方法?的主要内容,如果未能解决你的问题,请参考以下文章

在 Ruby 中递归列出目录的单线器?

如何要求来自另一个目录的 ruby​​ 文件

扫描并要求目录中的Ruby文件

Windows 徽标干净卸载

ruby 在目录中加载多个文件并要求它们

Eclipse Ruby 开发工具“要求”失败