Cleanest/One-liner way to require all files in directory in Ruby?
When creating gems, I often have a directory structure like this:
|--lib
|-- helpers.rb
`-- helpers
|-- helper_a.rb
`-- helper_b.rb
Inside the helpers.rb
, I'm just require
-ing the files in the helpers
directory. But I have to do things like this:
$:.push(File.dirname(__FILE__) + '/helpers')
require 'helper_a'开发者_开发百科
require 'helper_b'
Is there a way to make that one line so I never have to add to it? I just came up with this real quick:
dir = File.join(File.dirname(__FILE__), "helpers")
Dir.entries(dir)[2..-1].each { |file| require "#{dir}/#{file[0..-4]}" }
But it's two lines and ugly. What slick tricks have you done to make this a one liner?
project_root = File.dirname(File.absolute_path(__FILE__))
Dir.glob(project_root + '/helpers/*') {|file| require file}
Or to golf it a bit more:
Dir.glob(project_root + '/helpers/*', &method(:require))
I like require_relative:
Dir.glob('lib/**/*.rb') { |f| require_relative f }
The `&method(:require_relative) trick won't work with require_relative. I get:
`require_relative': cannot infer basepath (LoadError)
But it does save the hassle of computing project_root
I'm using ruby 2.0.0p247 (2013-06-27 revision 41674) [x86_64-darwin12.5.0]
# helpers.rb
Dir[__dir__ + '/helpers/*'].each &method(:require)
Hi the cleanest way I have discovered is to use Dir.glob with wild cards.
Put the following in your rakefile:
gem.files = Dir.glob('lib/**/ *.rb')
It should work a treat.
精彩评论