2016-09-17 46 views
0

我正在开发非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.rba.rb,...)。

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

我已看过autoloadrequire_all宝石。另一个解决方案是在每个文件中放入require以仅需要所需的文件。但文件太多了。

有什么想法吗?

+0

这个'require'项目的算法是什么?在目录的实际内容之前应该需要子目录内容? – IvRRimUm

+1

看看[Bundler](http://bundler.io/)。 –

回答

0

如果你知道你将使用这个命名约定整个项目 - 不要想用你的建议的解决方案(明确要求从a_base一) - 你可以做类似如下的内容:

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