我在我的一些rails应用程序中重构了一些共享代码,而且我遇到了一些sym链接目录的奇怪问题。基本上,我的rails应用程序的旧结构是:
RAILS_ROOT
-> app
-> config
-> initializers
-> common
->lib
-> common
...
一切正常,rails正在识别常用文件夹并加载其中的所有文件。
所以我决定将所有常见内容移到自己的repo中,并将其子模块放入我的rails应用程序中。所以新的文件夹结构看起来像
RAILS_ROOT
-> app
-> config
-> initializers
-> common -> ../../shared/initializers/
->lib
-> common -> ../shared/lib/
-> shared
-> initializers
-> lib
...
...
由于某种原因,sym链接目录中的文件都没有被加载,我不知道为什么。如果我在initializers文件夹中创建一个临时目录,并复制一些“常用”文件,它们加载正常,所以它似乎与它是sym链接的事实有关。
答案 0 :(得分:1)
所以我挖掘了rails源代码,并找到了以下用于加载初始化程序的代码:
def load_application_initializers
if gems_dependencies_loaded
Dir["#{configuration.root_path}/config/initializers/**/*.rb"].sort.each do |initializer|
load(initializer)
end
end
end
基于这个问题:Can I traverse symlinked directories in Ruby with a "**" glob?看起来代码不会跟随sym链接。
为了解决这个问题,我最终在Rails::Initializer.run
行
module Rails
class Initializer
def load_application_initializers
if gems_dependencies_loaded
Dir["#{configuration.root_path}/config/initializers/**{,/*/**}/*.rb"].sort.each do |initializer|
load(initializer)
end
end
end
end
end
这显然是黑客攻击,希望我找到一种更干净的方法,但是现在,它解决了我的问题。有趣的是,用于加载插件的代码和lib文件夹确实遵循sym链接。