如何在另一个Capistrano任务中调用Capistrano任务?
我正在尝试创建一个基本任务,用于将database.yml文件复制并链接到我的应用程序中,但我不知道为什么它无法正常工作。
I'm trying to create a basic task for copying and linking database.yml file into my app, but I can't figure out why it s not working.
我正在使用Capistrnao 3.1
I'm using Capistrnao 3.1
这是我的lib / capistrano / tasks / databases.cap文件:
This is my lib/capistrano/tasks/databases.cap file :
namespace :db_access do
# Idea : https://github.com/capistrano/sshkit/blob/master/EXAMPLES.md
desc 'Copy production database.yml from local workstation'
task :copy_production do
on roles :all do
execute :mkdir, '-p', "#{shared_path}/config"
upload! 'config/deploy/production.database.yml', "#{shared_path}/config/database.yml"
end
end
# Idea : http://stackoverflow.com/questions/9684649/capistrano-cant-deploy-my-database-yml
desc 'Create database.yml symlinks to current release'
task :create_symlinks do
on roles :all do
unless test "[ -f #{shared_path}/config/database.yml ]"
invoke 'db_access:copy_production'
end
execute :ln, "-nfs #{shared_path}/config/database.yml #{release_path}/config/database.yml"
end
end
end
这是我得到的输出:
douglas@bilbo:/var/www/odpf$ cap production db_access:create_symlinks
DEBUG [3f670dfd] Running /usr/bin/env [ -f /var/www/odpf/shared/config/database.yml ] on myserver.net
DEBUG [3f670dfd] Command: [ -f /var/www/odpf/shared/config/database.yml ]
DEBUG [3f670dfd] Finished in 0.589 seconds with exit status 1 (failed).
cap aborted!
**undefined method `verbosity' for "/usr/bin/env db_access:copy_production\n":String**
/home/douglas/.rvm/gems/ruby-2.1.0@rails3/gems/sshkit-1.3.0/lib/sshkit/formatters/pretty.rb:10:in `write'
/home/douglas/.rvm/gems/ruby-2.1.0@rails3/gems/sshkit-1.3.0/lib/sshkit/backends/printer.rb:14:in `block in execute'
/home/douglas/.rvm/gems/ruby-2.1.0@rails3/gems/sshkit-1.3.0/lib/sshkit/backends/printer.rb:13:in `tap'
/home/douglas/.rvm/gems/ruby-2.1.0@rails3/gems/sshkit-1.3.0/lib/sshkit/backends/printer.rb:13:in `execute'
/var/www/odpf/lib/capistrano/tasks/databases.cap:20:in `block (3 levels) in <top (required)>'
/home/douglas/.rvm/gems/ruby-2.1.0@rails3/gems/sshkit-1.3.0/lib/sshkit/backends/netssh.rb:54:in `instance_exec'
/home/douglas/.rvm/gems/ruby-2.1.0@rails3/gems/sshkit-1.3.0/lib/sshkit/backends/netssh.rb:54:in `run'
/home/douglas/.rvm/gems/ruby-2.1.0@rails3/gems/sshkit-1.3.0/lib/sshkit/runners/parallel.rb:12:in `block (2 levels) in execute'
Tasks: TOP => db_access:create_symlinks
我不知道如何调用其他任务。我从 https://github.com/capistrano启发了myslef /capistrano/blob/master/lib/capistrano/tasks/deploy.rake
I don't know how to invoke the other task. I inspirate myslef from https://github.com/capistrano/capistrano/blob/master/lib/capistrano/tasks/deploy.rake
如果我尝试不使用'invoke'关键字并且不使用''符号:
If I try without the 'invoke' keyword and without ' ' signs :
namespace :db_access do
# Idea : https://github.com/capistrano/sshkit/blob/master/EXAMPLES.md
desc 'Copy production database.yml from local workstation'
task :copy_production do
on roles :all do
execute :mkdir, '-p', "#{shared_path}/config"
upload! 'config/deploy/production.database.yml', "#{shared_path}/config/database.yml"
end
end
# Idea : http://stackoverflow.com/questions/9684649/capistrano-cant-deploy-my-database-yml
desc 'Create database.yml symlinks to current release'
task :create_symlinks do
on roles :all do
unless test "[ -f #{shared_path}/config/database.yml ]"
db_access.copy_production
end
execute :ln, "-nfs #{shared_path}/config/database.yml #{release_path}/config/database.yml"
end
end
end
结果如下:
douglas@bilbo:/var/www/odpf$ cap production db_access:create_symlinks --trace
** Invoke production (first_time)
** Execute production
** Invoke load:defaults (first_time)
** Execute load:defaults
** Invoke db_access:create_symlinks (first_time)
** Execute db_access:create_symlinks
cap aborted!
undefined local variable or method `db_access' for #<SSHKit::Backend::Netssh:0x00000002862340>
/var/www/odpf/lib/capistrano/tasks/databases.cap:20:in `block (3 levels) in <top (required)>'
/home/douglas/.rvm/gems/ruby-2.1.0@rails3/gems/sshkit-1.3.0/lib/sshkit/backends/netssh.rb:54:in `instance_exec'
/home/douglas/.rvm/gems/ruby-2.1.0@rails3/gems/sshkit-1.3.0/lib/sshkit/backends/netssh.rb:54:in `run'
/home/douglas/.rvm/gems/ruby-2.1.0@rails3/gems/sshkit-1.3.0/lib/sshkit/runners/parallel.rb:12:in `block (2 levels) in execute'
Tasks: TOP => db_access:create_symlinks
这肯定是一个简单的语法错误,但是由于我找不到解释它的指南
This must be a simple syntaxe mistake but since I can't find a guide that explain that I don't know how to do.
感谢您的帮助
我的命令
调用'db_access:copy_production'
是正确的。
my command invoke 'db_access:copy_production' was correct.
问题来自SSH-KIT,它的错误。
问题是Capistrano 3.1使用的是ssh-kit版本1.3。
因此,我们必须使用Capistrano 3.0.1直到ssh-kit得到修复。
The problem comes from SSH-KIT which has a bug. The problem is that Capistrano 3.1 is using ssh-kit version 1.3. So we have to use Capistrano 3.0.1 until ssh-kit get fixed.
解决方法:
gem uninstall capistrano
gem uninstall capistrano-rails
gem uninstall sshkit
rm Gemfile.lock
修改Gemfile:
gem 'capistrano', '~> 3.0.1'
gem 'sshkit', '~> 1.0.0'
安装gems:
bundle install