要求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目录中所有文件的最干净/单线方法?的主要内容,如果未能解决你的问题,请参考以下文章