【问题标题】:Require all files based on ancestors要求所有基于祖先的文件
【发布时间】:2016-09-17 13:27:28
【问题描述】:

我正在从事非 Rails Ruby 项目。项目结构如下:

--Root
  -Base
   -xyz_base.rb
   -abc_base.rb
  -Entities
    -A
     -base
      -a_base.rb
     -a.rb
    -B
     -b.rb
    -C
     -c.rb
  -app.rb

在 app.rb 我有如下内容:

Dir['./**/'].each {|dir| $:.push dir}
Dir["./**/*.rb"].each {|rb| require rb}

所以,所有文件都包含在项目中 (abc_base.rb,a.rb,...)。

问题是,它不知道应该先需要哪个。例如,a_base.rb 需要在 a.rb 之前。但是,实际上,它首先需要a.rb,然后在a_base.rb 中我得到uninitialized constant Entities::A::Base (NameError)cannot load such file

我研究了autoloadrequire_all gem。还有另一种解决方案是在每个文件中放入 require 只需要需要的文件。但是文件太多了。

有什么想法吗?

【问题讨论】:

  • 这个require 项目的算法是什么?子目录内容应该在目录实际内容之前?
  • 看看Bundler

标签: ruby autoload


【解决方案1】:

如果您知道您将在整个项目中使用此命名约定 - 并且不想使用您提出的解决方案(明确要求 a_base 来自 a) - 您可以执行类似于以下的操作:

Dir.glob("**/[a-z].rb").each do |file| 
  m = /(.+)\.rb/.match(file)
  require_relative "#{m[1]}_base.rb" # entities/a/a_base.rb
  require_relative file
end

【讨论】:

    猜你喜欢
    • 2019-06-17
    • 2011-07-23
    • 1970-01-01
    • 2014-11-10
    • 2019-12-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多