我在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。所以我理解为什么我得到名称空间方法错误。这个问题的解决方法是什么?
答案 0 :(得分:9)
在config/deploy.rb
中,尝试load
而不是require
。此外,capistrano已经像RAILS_ROOT
一样运行,因此无需使用__FILE__
:
load "lib/capistrano_utilities"
在capistrano配置文件中,重新定义load
以将另一个配置文件加载到当前配置中。在向它传递路径时,它实际上调用了load_from_file
(由capistrano定义的私有方法),它只是从磁盘读取文件而instance_eval
就是它。
答案 1 :(得分:0)
检查Rails.root上的Capfile。 如果你使用capistrano 3,你会看到这一行;
Dir.glob('lib/capistrano/tasks/*.cap').each { |r| import r }
现在,将您的文件放在" lib / capistrano / tasks / capistrano_utilities.cap"它将被加载。