21

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

|--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]}" }

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

4

4 回答 4

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

或者打高尔夫球多一点:

Dir.glob(project_root + '/helpers/*', &method(:require))
于 2010-03-21T19:13:50.267 回答
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 revision 41674) [x86_64-darwin12.5.0]

于 2014-10-11T23:08:02.537 回答
1
# helpers.rb
Dir[__dir__ + '/helpers/*'].each &method(:require)
于 2017-03-08T14:03:22.117 回答
0

嗨,我发现的最干净的方法是将 Dir.glob 与通配符一起使用。

将以下内容放入您的 rakefile 中:

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

它应该是一种享受。

于 2011-12-31T16:56:14.530 回答