今天使用Rails3.0.7 + rake 0.9.2部署Rails應用到heroku時,發現在heroku上面無法執行rake db:migrate命令。報錯信息如下:






看來是rake的問題了,于是查了一下rake的版本









網上google了一下,發覺又是一個Rails和其他gem不兼容的問題,只要把rake的版本設置為0.8.7就可以了。
Rails3.0的Gem配置在文件Gemfile中設置,但是默認的不會有rake的版本指定,我們需要手工指定。修改Gemfile,增加對rake的版本指定


這樣在沒有rake0.8.7這個版本時,bundle會自動去RubyForge.org下載,如果本地已經安裝了則使用本地的gem
滿以為這樣就可以了,可是一執行bundle install還是報錯










這是為什么呢?怎么會說bundle被鎖定呢?原來啊Rails為了保證應用在不同的環境下配置一樣,會對Gemfile生成一個lock文件,該lock文件把當前應用的gem配置都記錄下來,并一同發布出去(這里指的是GitHub),一旦其他人下載該應用后執行bundle install時會強制按照該lock文件中指定的gem版本去下載或調用,而不是使用其他人本地已經安裝的gem,這樣就可以保證在不同的環境下應用的特性一致。
在完成對bundle的解鎖后,依次執行下列命令



完成之后,再次執行heroku rake db:migrate,問題解決













-------------------------------------------------------------
生活就像打牌,不是要抓一手好牌,而是要盡力打好一手爛牌。