我试图将我的一些Ruby on Rails项目从Capistrano 2.x升级到Capistrano 3.x.
我按照这个伟大的tutorial来设置配置文件。我的配置文件如下所示:
Capfile
require 'capistrano/setup'
require 'capistrano/deploy'
require 'capistrano/rails'
Dir.glob('lib/capistrano/tasks/*.rake').each { |r| import r }
deploy.rb
lock '3.4.0'
set :scm, :git
set :deploy_user, "deploy"
set :repo_url, "git_url"
set :application, "app_name"
set :local_app, "193/#{application}"
set :deploy_to, "/home/#{deploy_user}/rails/#{application}"
set :pty, true
set :ssh_options, {:forward_agent => true}
set :linked_files, %w{config/database.yml config/secrets.yml}
set :linked_dirs, %w{log tmp/pids tmp/cache tmp/sockets vendor/bundle public/system}
###
# BBDD settings
#
set :db_passwd, "db_password"
set :db_name, "db_name_production"
部署/ production.rb
set :stage, :production
set :rails_env, :production
set :server_ip, "xxx.xxx.xxx.xxx"
server server_ip, user: 'deploy', roles: %w{web app db}
role :app, server_ip
role :web, server_ip
role :db, server_ip, :primary => true
现在,当我尝试展示我的Capistrano任务或当我尝试部署我的项目时,Capistrano会向我抛出错误。
(Backtrace限制为导入任务)上限中止! NoMethodError: 未定义的方法`map' for:roles:Symbol
(通过使用--trace运行任务查看完整跟踪)
我花了一天谷歌搜索没有结果。有什么想法吗?
修改
上限生产部署:setup --trace
cap aborted!
NoMethodError: undefined method `map' for :roles:Symbol
/Users/carro/.rvm/gems/ruby-1.9.3-p547/gems/rake-10.4.2/lib/rake/task.rb:309:in `set_arg_names'
/Users/carro/.rvm/gems/ruby-1.9.3-p547/gems/rake-10.4.2/lib/rake/task_manager.rb:40:in `define_task'
/Users/carro/.rvm/gems/ruby-1.9.3-p547/gems/rake-10.4.2/lib/rake/task.rb:365:in `define_task'
/Users/carro/.rvm/gems/ruby-1.9.3-p547/gems/rake-10.4.2/lib/rake/dsl_definition.rb:66:in `task'
/Users/carro/Sites/193/capistrano/lib/capistrano/tasks/deploy.rake:4:in `block in <top (required)>'
/Users/carro/.rvm/gems/ruby-1.9.3-p547/gems/rake-10.4.2/lib/rake/task_manager.rb:209:in `in_namespace'
/Users/carro/.rvm/gems/ruby-1.9.3-p547/gems/rake-10.4.2/lib/rake/dsl_definition.rb:147:in `namespace'
/Users/carro/Sites/193/capistrano/lib/capistrano/tasks/deploy.rake:1:in `<top (required)>'
/Users/carro/.rvm/gems/ruby-1.9.3-p547/gems/rake-10.4.2/lib/rake/rake_module.rb:28:in `load'
/Users/carro/.rvm/gems/ruby-1.9.3-p547/gems/rake-10.4.2/lib/rake/rake_module.rb:28:in `load_rakefile'
/Users/carro/.rvm/gems/ruby-1.9.3-p547/gems/rake-10.4.2/lib/rake/default_loader.rb:10:in `load'
/Users/carro/.rvm/gems/ruby-1.9.3-p547/gems/rake-10.4.2/lib/rake/application.rb:767:in `load_imports'
/Users/carro/.rvm/gems/ruby-1.9.3-p547/gems/capistrano-3.4.0/lib/capistrano/application.rb:93:in `load_imports'
/Users/carro/.rvm/gems/ruby-1.9.3-p547/gems/rake-10.4.2/lib/rake/application.rb:697:in `raw_load_rakefile'
/Users/carro/.rvm/gems/ruby-1.9.3-p547/gems/rake-10.4.2/lib/rake/application.rb:94:in `block in load_rakefile'
/Users/carro/.rvm/gems/ruby-1.9.3-p547/gems/rake-10.4.2/lib/rake/application.rb:176:in `standard_exception_handling'
/Users/carro/.rvm/gems/ruby-1.9.3-p547/gems/rake-10.4.2/lib/rake/application.rb:93:in `load_rakefile'
/Users/carro/.rvm/gems/ruby-1.9.3-p547/gems/rake-10.4.2/lib/rake/application.rb:77:in `block in run'
/Users/carro/.rvm/gems/ruby-1.9.3-p547/gems/rake-10.4.2/lib/rake/application.rb:176:in `standard_exception_handling'
/Users/carro/.rvm/gems/ruby-1.9.3-p547/gems/rake-10.4.2/lib/rake/application.rb:75:in `run'
/Users/carro/.rvm/gems/ruby-1.9.3-p547/gems/capistrano-3.4.0/lib/capistrano/application.rb:15:in `run'
/Users/carro/.rvm/gems/ruby-1.9.3-p547/gems/capistrano-3.4.0/bin/cap:3:in `<top (required)>'
/Users/carro/.rvm/gems/ruby-1.9.3-p547/bin/cap:23:in `load'
/Users/carro/.rvm/gems/ruby-1.9.3-p547/bin/cap:23:in `<main>'
/Users/carro/.rvm/gems/ruby-1.9.3-p547/bin/ruby_executable_hooks:15:in `eval'
/Users/carro/.rvm/gems/ruby-1.9.3-p547/bin/ruby_executable_hooks:15:in `<main>'
答案 0 :(得分:17)
这种情况正在发生,因为Capistrano任务现在是Rake任务,而Rake期望这样的结构:
/Users/carro/Sites/193/capistrano/lib/capistrano/tasks/
根据您的堆栈跟踪判断,您有on ... roles
中定义的自定义Capistrano任务。您需要将它们转换为Capistrano 3 task :dump, :roles => :db do
...
end
语法才能使它们正常工作。
例如,您可以像这样更改Capistrano 2任务:
task :dump do
on primary roles :db do
...
end
end
对于Capistrano 3:
Text Prompt
有关详细信息,请参阅here。