我的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
中的部署脚本时,它才能运行?
答案 0 :(得分:1)
根据capistrano/rails gem的文档,您必须设置catch
选项以检查是否需要运行迁移。
我想这是您需要的选项,您应该将其添加到:conditionally_migrate
中,这样:
deploy.rb
<小时/> 要回答您的问题,在
migrations.rake
文件中,任务set :conditionally_migrate, true
已设置为在deploy:migrate
之后运行。
此外,如果要从部署过程中完全删除此任务,并始终通过调用deploy:updated
手动运行迁移,您可以这样做:
deploy:migrate