2009-12-11 23 views
6

我在deploy.rbCapistrano的:deploy.rb文件重構

namespace :app do 
    desc "copies the configuration frile from ~/shared/config/*.yml to ~/config" 
    task :copy_config_files,:roles => :app do 
    run "cp -fv #{deploy_to}/shared/config/hoptoad.rb #{release_path}/config/initializers" 
    run "cp -fv #{deploy_to}/shared/config/app_config.yml #{release_path}/config/app_config.yml" 
    end 
end 

下面的代碼我認爲這將是一個好主意,讓我deploy.rb文件乾淨,我試圖上面的代碼移到配置下的capistrano_utilities.rb。我正在使用Rails應用程序。我加入以下代碼行deploy.rb

require File.expand_path(File.dirname(__FILE__) + "/../lib/capistrano_utilities") 

現在我得到以下錯誤。

undefined method `namespace' for main:Object (NoMethodError) 

deploy.rb中self的值是Capistrano :: Configuration。而capistrano_utilities中的自我價值是Main。所以我明白爲什麼我得到命名空間方法錯誤。這個問題的解決方法是什麼?

回答

9

在您的config/deploy.rb中,請嘗試load而不是require。此外,Capistrano的運行,已經好象你在RAILS_ROOT,因此沒有必要使用__FILE__

load "lib/capistrano_utilities" 

在Capistrano的配置文件,load重新定義爲其他配置文件加載到當前配置。當傳遞一個路徑時,它實際上調用load_from_file(由capistrano定義的私有方法),它只是從磁盤讀取文件,instance_eval就是這樣。

+2

我雖然要求和加載之間的唯一區別是,其中一個重讀文件到內存多次,另一個只讀一次。你能解釋爲什麼加載工作,並要求不。 – Roger 2009-12-11 15:29:03

+0

羅傑,更多細節增加了關於capistrano的具體細節。 – 2009-12-11 16:12:37

+0

謝謝瑞恩。來自ruby生態系統的另一個奇妙魔法 – Roger 2009-12-11 18:19:43

0

檢查您的Capfile Rails.root。 如果你使用capistrano 3,你會看到這一行;現在

Dir.glob('lib/capistrano/tasks/*.cap').each { |r| import r }

,把你的文件的 「LIB/Capistrano酒店/任務/ capistrano_utilities.cap」,它會被加載。

相關問題