rails无法识别sym链接目录

时间:2012-01-23 07:11:28

标签: ruby-on-rails macos unix

我在我的一些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链接的事实有关。

1 个答案:

答案 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链接。