我正在重构我的一些rails应用程序中的一些共享代码,并且我遇到了一些符号链接目录的奇怪问题。基本上,我的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
...
...
由于某种原因,符号链接目录中没有任何文件被加载,我不知道为什么。如果我在initializers文件夹中创建一个临时目录,并复制一些"通用"文件,它们加载良好,所以这似乎与它是符号链接的事实有关。
所以我深入研究了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
基于这个问题:我可以在Ruby中遍历符号链接的目录吗**"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文件夹的代码确实遵循符号链接。