2009-12-11 2 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 в config. Я использую Rails-приложение. И я добавил следующую строку кода для deploy.rb

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

Теперь я получаю следующую ошибку.

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

Значение self в deploy.rb - Capistrano :: Configuration. Хотя значение self в capistrano_utilities является основным. Поэтому я понимаю, почему я получаю ошибку метода пространства имен. В чем проблема?

ответ

9

В вашем config/deploy.rb попробуйте load вместо require. Кроме того, Capistrano уже работает, как если бы вы на RAILS_ROOT, так что нет никакой необходимости использовать __FILE__:

load "lib/capistrano_utilities" 

В конфигурационном файле Capistrano, load переопределяется, чтобы загрузить другой файл конфигурации в текущей конфигурации. При передаче пути к нему он фактически вызывает load_from_file (частный метод, определенный capistrano), который просто считывает файл с диска и instance_eval.

+2

Я, хотя единственная разница между требованием и нагрузкой заключалась в том, что один из них перечитывает файл в память несколько раз, а другой читает только один раз. Можете ли вы объяснить, почему загрузка работает и чего не требует. – Roger

+0

Roger, подробнее добавлено о специфике capistrano. –

+0

благодарит Райана. Еще одна чудесная магия из рубиновой экосистемы. – Roger

0

Проверьте свой Capfile на Rails.root. , если вы используете capistrano 3, вы видите эту строку;

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

Теперь, поместите файл на "Библиотека/Capistrano/задач/capistrano_utilities.cap" и он будет загружен.

Смежные вопросы