Capistrano:deploy.rb文件重构

我在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文件干净是个好主意,我试图在config下面将代码移到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中self的值是Main。 所以我理解为什么我得到名称空间方法错误。 这个问题的解决方法是什么?

config/deploy.rb ,尝试load而不是require 。 此外,capistrano已经运行,就像你在RAILS_ROOT ,所以不需要使用__FILE__

 load "lib/capistrano_utilities" 

在capistrano配置文件中,重新定义load以将另一个配置文件加载到当前配置中。 当传递一个路径时,它实际上调用load_from_file (由capistrano定义的私有方法),它只是从磁盘和instance_eval读取文件。

检查Rails.root上的Capfile。 如果你使用capistrano 3,你会看到这一行;

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

现在,将您的文件放在“lib / capistrano / tasks / capistrano_utilities.cap”上,它将被加载。