【问题标题】:NoMethodError: undefined method `map' for :roles:Symbol in Capistrano 3NoMethodError:Capistrano 3中:roles:Symbol的未定义方法`map'
【发布时间】:2015-07-13 20:34:32
【问题描述】:

我正在尝试将我的一些 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"

deploy/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 会抛出一个错误。

(回溯仅限于导入的任务)上限中止!无方法错误: :roles:Symbol 的未定义方法 `map'

(通过使用 --trace 运行任务查看完整跟踪)

我花了一天谷歌搜索没有结果。有什么想法吗?

编辑

cap 生产部署: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>'

【问题讨论】:

  • Map 是数组方法,在您调用 :roles 的代码中某处,所以它在抱怨该错误。
  • 不,这不是代码中的错误,或者至少不是我编写了方法映射。如果我执行“在项目中查找”字图,则没有结果。
  • 您可以运行cap production deploy:setup --trace 以查看更多信息吗?

标签: ruby-on-rails capistrano capistrano3


【解决方案1】:

发生这种情况是因为 Capistrano 任务现在是 Rake 任务,而 Rake 期望这样的构造:

task :name, [:arg, :arg] => :dependency do
  ...
end

从您的堆栈跟踪来看,您在/Users/carro/Sites/193/capistrano/lib/capistrano/tasks/ 中定义了自定义 Capistrano 任务。您需要将它们转换为 Capistrano 3 on ... roles 语法才能使其正常工作。

例如,您将像这样更改 Capistrano 2 任务:

task :dump, :roles => :db do
  ...
end

Capistrano 3:

task :dump do
  on primary roles :db do
    ...
  end
end

更多详情请见here

【讨论】:

    猜你喜欢
    • 2015-12-28
    • 1970-01-01
    • 2017-01-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-11
    • 2013-05-01
    • 2012-12-11
    相关资源
    最近更新 更多