今天使用Rails3.0.7 + rake 0.9.2部署Rails應(yīng)用到heroku時(shí),發(fā)現(xiàn)在heroku上面無(wú)法執(zhí)行rake db:migrate命令。報(bào)錯(cuò)信息如下:






看來(lái)是rake的問(wèn)題了,于是查了一下rake的版本









網(wǎng)上google了一下,發(fā)覺(jué)又是一個(gè)Rails和其他gem不兼容的問(wèn)題,只要把rake的版本設(shè)置為0.8.7就可以了。
Rails3.0的Gem配置在文件Gemfile中設(shè)置,但是默認(rèn)的不會(huì)有rake的版本指定,我們需要手工指定。修改Gemfile,增加對(duì)rake的版本指定


這樣在沒(méi)有rake0.8.7這個(gè)版本時(shí),bundle會(huì)自動(dòng)去RubyForge.org下載,如果本地已經(jīng)安裝了則使用本地的gem
滿以為這樣就可以了,可是一執(zhí)行bundle install還是報(bào)錯(cuò)










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



完成之后,再次執(zhí)行heroku rake db:migrate,問(wèn)題解決













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