简体   繁体   English

Capistrano 3任务参数错误

[英]Capistrano 3 Task Argument Error

I'm using a capistrano 3 task that should work, but am getting the error: 我正在使用应该运行的capistrano 3任务,但遇到了错误:

> cap staging deploy --trace
** Invoke staging (first_time)
** Invoke use_rvm (first_time)
** Execute use_rvm
** Execute staging
** Invoke load:defaults (first_time)
** Execute load:defaults
cap aborted!
Task Argument Error
/Users/stevenspiel/.rbenv/versions/1.9.3-p392/lib/ruby/gems/1.9.1/gems/rake-10.4.2/lib/rake/task_manager.rb:109:in `resolve_args_with_dependencies'
/Users/stevenspiel/.rbenv/versions/1.9.3-p392/lib/ruby/gems/1.9.1/gems/rake-10.4.2/lib/rake/task_manager.rb:75:in `resolve_args'
/Users/stevenspiel/.rbenv/versions/1.9.3-p392/lib/ruby/gems/1.9.1/gems/rake-10.4.2/lib/rake/task_manager.rb:27:in `define_task'
/Users/stevenspiel/.rbenv/versions/1.9.3-p392/lib/ruby/gems/1.9.1/gems/rake-10.4.2/lib/rake/task.rb:365:in `define_task'
/Users/stevenspiel/.rbenv/versions/1.9.3-p392/lib/ruby/gems/1.9.1/gems/rake-10.4.2/lib/rake/dsl_definition.rb:66:in `task'
config/deploy.rb:65:in `<top (required)>'
...

the task is straightforward: 任务很简单:

set :backup_to, '/home/deployer/app/db_backups'

desc 'Backup the remote production database'
task :backup_database, roles: :db, only: { primary: true } do
  run "mkdir -p #{backup_to}" # create backup folder unless already exists

  filename = "#{backup_to}/app_#{Time.now.strftime '%Y%m%d%H%M%S'}.sql.gz"

  # Check if we've got database config
  database_config = File.join(deploy_to, '/current/config/database.yml')

  if remote_file_exists?(database_config)
    text = capture("cat #{database_config}")

    # `capture` is returning some bad whitespace that YAML::load can't handle.
    # This strips out whitespace except for innocuous spaces and newlines.
    text.gsub!(/[^\n \S]/, '')

    config = YAML::load(text)[rails_env]

    on_rollback { run "rm #{filename}" } # if migration rolls back, removes backup

    run "pg_dump -U #{config['username']} #{config['database']} -W -h #{config['host']} | gzip --best > #{filename}" do |ch, stream, out|
      ch.send_data "#{config['password']}\n" if out =~ /^Password:/
    end
  else
    logger.debug('[BackupDatabase] No configuration file was found.')
  end
end

before 'deploy:migrate', :backup_database if rails_env == 'staging'

And the error is coming from the task declaration: 错误来自任务声明:

task :backup_database, roles: :db, only: { primary: true } do

What is wrong with it? 怎么了

EDIT 编辑

Thanks to basia's suggestion, I ended up doing this: 感谢basia的建议,我最终做到了:

task :backup_database do
  on roles(:app), except: { primary: true } do
    ...
  end
end

You're using Capistrano 2 syntax and for Capistrano 3 the syntax is different than 2, have a look https://semaphoreapp.com/blog/2013/11/26/capistrano-3-upgrade-guide.html . 您使用的是Capistrano 2语法,而Capistrano 3的语法不同于2,请看https://semaphoreapp.com/blog/2013/11/26/capistrano-3-upgrade-guide.html Your code should look more like that (not tested): 您的代码应更像这样(未经测试):

task :backup_database do
   roles(:db) do
       .....
  on
end 

Or downgrade to Cap 2 :) 或降级为第2章:)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM