2012-01-23 95 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鏈接。