我试图了解 capistrano 3.1 是如何工作的,但由于它缺乏文档(它的 capistrano,所以......),我的理解低于我的理解。
让我解释。
这是从 capistrano/rails gem 中截取的片段
namespace :deploy do
desc 'Runs rake db:migrate if migrations are set'
task :migrate => [:set_rails_env] do
on primary fetch(:migration_role) do
within release_path do
with rails_env: fetch(:rails_env) do
execute :rake, "db:migrate"
end
end
end
end
#[...]
end
执行时cap integration deploy:migrate
,它发送以下命令:
cd /srv/app/releases/20131106101722 && ( RAILS_ENV=integration /tmp/app/rvm-auto.sh . rake assets:precompile )
我将为delayed_job 提供的(非工作)代码稍微更改为
namespace :delayed_job do
def args
fetch(:delayed_job_args, '')
end
def delayed_job_roles
fetch(:delayed_job_server_role, :app)
end
def delayed_job_bin
fetch(:delayed_job_bin, :'bin/delayed_job')
end
desc 'Restart the delayed_job process'
task :restart do
on roles(delayed_job_roles) do
within release_path do
with rails_env: fetch(:rails_env) do
execute delayed_job_bin, 'restart', args
end
end
end
end
end
我得到以下命令cd /srv/winddle/current && ( RAILS_ENV=integration bin/delayed_job restart )
显然,它错过了bundle exec
命令。我深入研究 capistrano/bundler 和 capistrano/rails 来寻找某种钩子,它可以自动将 bundle exec 添加到这些命令中的任何一个(或强制注册 ssh kits 命令)但找不到任何。
我发现的唯一解决方案是使用
execute :bundle, :exec, delayed_job_bin, :start, args
这当然是不可接受的。
欢迎任何适当的解决方案/解释。问候