2009-12-11 36 views
6

He siguiente código en mi deploy.rbCapistrano: archivo deploy.rb refactorización

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 

pensé que sería una buena idea para mantener mi archivo deploy.rb limpio y me trató de moverse por encima de código para capistrano_utilities.rb bajo config. Estoy usando la aplicación Rails. Y agregué la siguiente línea de código para implementar .rb

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

Ahora recibo el siguiente error.

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

El valor de self en el deploy.rb es Capistrano :: Configuration. Mientras que el valor de self en capistrano_utilities es Main. Entonces entiendo por qué estoy obteniendo un error en el método del espacio de nombres. ¿Cuál es la solución para este problema?

Respuesta

9

En su config/deploy.rb, intente load en lugar de require. Además, Capistrano ya se ejecuta como si estás en el RAILS_ROOT, así que no hay necesidad de utilizar __FILE__:

load "lib/capistrano_utilities" 

En un archivo de configuración Capistrano, load se redefine para cargar otro archivo de configuración en la configuración actual. Al pasarle una ruta, en realidad llama al load_from_file (un método privado definido por capistrano) que solo lee el archivo del disco y instance_eval.

+2

Creo que la única diferencia entre require y load es que uno de ellos vuelve a leer el archivo en la memoria varias veces y el otro solo una vez. ¿Puede explicar por qué la carga funciona y no lo requiere? – Roger

+0

Roger, se agregaron más detalles sobre los detalles de capistrano. –

+0

gracias Ryan. Otra maravillosa magia del ecosistema de rubí. – Roger

0

Compruebe su Capfile en Rails.root. si usa capistrano 3, verá esta línea;

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

Ahora, poner el archivo en "lib/Capistrano/tareas/capistrano_utilities.cap" y se cargará.

Cuestiones relacionadas