Capistrano:deploy.rb文件重构

Rog*_*ger 6 ruby capistrano ruby-on-rails

我在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
Run Code Online (Sandbox Code Playgroud)

我认为保持deploy.rb文件干净是个好主意,我试图在config下将代码移到capistrano_utilities.rb之上.我正在使用Rails应用程序.我将以下代码行添加到deploy.rb中

require File.expand_path(File.dirname(__FILE__) + "/../lib/capistrano_utilities")
Run Code Online (Sandbox Code Playgroud)

现在我收到了以下错误.

undefined method `namespace' for main:Object (NoMethodError)
Run Code Online (Sandbox Code Playgroud)

deploy.rb中self的值是Capistrano :: Configuration.虽然capistrano_utilities中self的值是Main.所以我理解为什么我得到名称空间方法错误.这个问题的解决方法是什么?

Rya*_*ary 9

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

load "lib/capistrano_utilities"
Run Code Online (Sandbox Code Playgroud)

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

  • 我虽然require和load之间的唯一区别是,其中一个将文件重新读入内存多次,另一个只读取一次.你能解释为什么负载工作和需要没有. (2认同)