【问题标题】:Cleanest/One-liner way to require all files in directory in Ruby?要求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]}" }

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

【问题讨论】:

标签: ruby require


【解决方案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的问题。
      猜你喜欢
      • 2010-10-18
      • 2012-01-17
      • 1970-01-01
      • 2015-02-13
      • 1970-01-01
      • 2010-10-21
      • 2010-12-01
      相关资源
      最近更新 更多