新手问题 [已解决] 用 capistrano 部署,seeds.rb 变更了怎么办?

chairy11 · 2014年12月02日 · 最后由 chairy11 回复于 2014年12月03日 · 2400 次阅读

问题

我用 capistrano 部署,因为 db 的数据表设计变化,seed 数据也有了变化,所以是先运行了

rake db:migrate RAILS_ENV=production
rake db:seed RAILS_ENV=production

再运行

cap production deploy

但我发现,现在的目录里,

$ ls

app  Capfile  config.ru  db       Gemfile.lock  log     Rakefile   releases  revisions.log  spec                tmp
bin   config    current    Gemfile  lib           public  README.md  repo      shared          vendor

在外面这个 db 里面的 seeds.rb 是旧的,而且我 rake db:seed RAILS_ENV=production 执行的是这个。 而 current 里面的 db/seeds.rb 是新的,但如果我在这个目录下去执行,会出错,

$ rake db:seed RAILS_ENV=production
(in /weekly_report/releases/20141202075349)
rake aborted!
LoadError: cannot load such file -- database_cleaner

难道要我手工把外面 db 里的文件换成新的吗?好像不科学吧? 但 rake db:migrate RAILS_ENV=production 却是正常的……说明执行这句的时候取的是 current 里面的 schema……

解决方案

变更数据结构和 seeds.rb 后,确实应该是在 current 目录下进行

cap production deploy:migrate

然后我手动进入 current 目录,进行

rake db:seed RAILS_ENV=production

之前出现过找不到 database_cleaner,是因为之前在 gemfile 中我把它装在 test group 下了(奇怪,那为什么我平时在 development 环境中也能用呢?),把它拿出来就好。

gem 'database_cleaner'          

cap -T 我记得有的,没有可以自己写一个 rake task 或者 https://github.com/dei79/capistrano-rails-collection 这个 gem 省事

#1 楼 @flowerwrong 没有与 db:seed 对应的。但按说我手动执行也不应该出错啊!

#1 楼 @flowerwrong 解决了,谢谢:)

#3 楼 @chairy11 不是你这么用的,你这样和 ssh 过去有什么差别?没 capitrano 啥事啊。rake task 才是王道。

#4 楼 @flowerwrong 可是,seed 很少改动的。你说要自己写一个可以用 cap production deploy:seed 的命令吗? 额,我不太会写耶……改天试试……

需要 登录 后方可回复, 如果你还没有账号请 注册新账号