2012-01-23 109 views
0

我正在重构一些我的rails应用程序中的某些共享代码,并且遇到了一些sym链接目录中的奇怪问题。基本上,我对我的Rails应用程序的旧结构为:rails无法识别sym链接目录

RAILS_ROOT 
    -> app 
    -> config 
    -> initializers 
     -> common 
    ->lib 
    -> common 
    ... 

事情本来进行得很好,和铁轨被识别常见的文件夹,并加载所有的文件在那里。

所以我决定将所有常见的东西移动到它自己的repo中,并将其模块化到我的rails应用程序中。因此,新的文件夹结构看起来像

RAILS_ROOT 
    -> app 
    -> config 
    -> initializers 
     -> common -> ../../shared/initializers/ 
    ->lib 
    -> common -> ../shared/lib/ 
    -> shared 
    -> initializers 
    -> lib 
    ... 
    ... 

出于某种原因,没有在符号链接目录中的文件越来越加载,我不知道为什么。如果我在初始化文件夹中创建一个临时目录,并复制一些“常用”文件,它们会正常加载,所以它看起来与sym链接有关。

+0

看看会发生什么,如果你'装入 - 绑定“它们。 – Reactormonk

+0

我在OS X上努力(尽管我部署到cent机器上),并且似乎没有绑定选项。有OS X的bindfs,但我读到它有一些问题。 – gmoniey

回答

1

所以我挖成轨源,发现下面的代码加载初始化:

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?它看起来像代码不会跟随符号链接。

要解决这个问题,我最后决定将以下猴子补丁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链接。