我想有条件地覆盖deploy:migrate
,以便我们可以手动运行某些迁移。
以下是config/deploy/tasks/deploy.rake
中的内容:
namespace :deploy do
if ENV['DB_MIGRATE'] == 'skip'
desc "Override Capistrano's default behavior, do not migrate on deploy"
task :migrate do
raise 'BOO!'
end
end
end
这是我在运行DB_MIGRATE=skip cap staging deploy:migrate
时看到的内容:
INFO [deploy:migrate] Run `rake db:migrate`
DEBUG [c0ed2f81] Running /usr/bin/env if test ! -d /path/current; then echo "Directory does not exist '/path/current'" 1>&2; false; fi as deploy@host.
DEBUG [c0ed2f81] Command: if test ! -d /path/current; then echo "Directory does not exist '/path/current'" 1>&2; false; fi
DEBUG [c0ed2f81] Finished in 1.061 seconds with exit status 0 (successful).
INFO [2f3a4cc7] Running bundle exec rake db:migrate as deploy@host.
DEBUG [2f3a4cc7] Command: cd /path/current && ( RAILS_ENV="staging" bundle exec rake db:migrate )
INFO [2f3a4cc7] Finished in 6.518 seconds with exit status 0 (successful).
(Backtrace restricted to imported tasks)
cap aborted!
BOO!
Tasks: TOP => deploy:migrate
(See full trace by running task with --trace)
从输出结果来看,似乎Capistrano正在做它总是做的事情,然后,做了我要求它做的事情(提出异常)。
如何完全摆脱Capistrano的默认deploy:migrate
?
答案 0 :(得分:2)
我通过在capistrano/rails/migrations
中有条件地要求Capfile
来解决这个问题,即
# Migrations can be skipped by setting up local 'SKIP_MIGRATIONS' variable, i.e.
# SKIP_MIGRATIONS=true bundle exec cap production deploy
unless ENV['SKIP_MIGRATIONS']
require 'capistrano/rails/migrations'
end
答案 1 :(得分:1)
根据我的经验,我会说它正在查看遥控器上的环境变量,而不是本地的。调用cap staging deploy会将远程环境var设置为RAILS_ENV = staging。但是,因为这意味着登录遥控器并设置var,所以它很容易使用capistrano。
更好的方法是使用capistrano条件:https://github.com/deviantech/capistrano-conditional
其README声明:
从Capistrano 2到Capistrano 3的一个重大变化是任务定义现在是附加的,因此定义新任务不会覆盖现有定义。
答案 2 :(得分:0)
文档中有一章Overriding Capistrano Tasks解释了整个过程:
在Capistrano v2中重新定义任务时,原始任务被替换。构建Capistrano v3的Rake DSL是附加的,但是[...]
但也可以完全清除任务,然后从头开始重新定义。
这正是我所需要的。
答案 3 :(得分:0)
在此处扩展已接受的答案,这将OP和链接的文档整合到一个完整的解决方案中:
{{1}}