2009-12-11 20 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”,它会被加载。

相关问题