rails无法识别符号链接的目录



我正在重构我的一些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文件夹的代码确实遵循符号链接。

最新更新