capistrano 3 `rake db:migrate` 仍然运行

capistrano 3 `rake db:migrate` runs anyway

我的 rails 应用程序使用 capistrano 3.4.0 进行部署任务。 在我的 Capfile 中,我有行 require 'capistrano/rails/migrations' 以便配置可以 运行 数据库迁移的任务。 当我 cap production deploy 时,我总是可以看到以下输出:

INFO [deploy:migrate] Run `rake db:migrate`
DEBUG [6214167f] Running /usr/bin/env if test ! -d XXXX/releases/20160117093811; then echo "Directory does not exist 'XXXX/releases/20160117093811'" 1>&2; false; fi as deploy@candiru-web
DEBUG [6214167f] Command: if test ! -d XXXX/releases/20160117093811; then echo "Directory does not exist 'XXXX/releases/20160117093811'" 1>&2; false; fi
DEBUG [6214167f] Finished in 0.005 seconds with exit status 0 (successful).
INFO [1ebeb8c8] Running ~/.rvm/bin/rvm default do bundle exec rake db:migrate as deploy@candiru-web
DEBUG [1ebeb8c8] Command: cd XXXX/releases/20160117093811 && ( RAILS_ENV=production ~/.rvm/bin/rvm default do bundle exec rake db:migrate )

即使我不添加类似 after :deploy, "deploy:migrate" 的内容。

如果我注释掉 require 'capistrano/rails/migrations' 行,将不会执行迁移。

为什么?不应该 运行 仅当我将任务添加到 config/deploy.rb 中的部署脚本时?

根据 capistrano/rails gem 的文档,您必须设置 :conditionally_migrate 选项以检查是否需要 运行 迁移。

我想这就是您需要的选项,您应该将其添加到您的 deploy.rb 中,这样:

set :conditionally_migrate, true


为了回答您的问题,在 migrations.rake 文件中,任务 deploy:migrate 已在 deploy:updated.

之后设置为 运行

此外,如果您想从部署过程中完全删除此任务,并始终通过调用 deploy:migrate 手动 运行 迁移,您可以这样做:

Rake::Task["deploy:migrate"].clear_actions