2012年6月2日 星期六

Rails | 佈署到heroku上(Rails 3.2)

其實做完Rails 101已經好一陣子,結果拖拖拖到現在才開始要寫筆記,卻也想不起來啥是重要的東西XD




通過了安裝Rails的關卡,後面比較麻煩的就只剩下佈署的問題。相較起其他的VPN或自有主機,Heroku真的是方便到一個不行,然而就算是再方便,因為Rails release出新版的關係也會有一些卡卡的地方,尤其是Rails 3以上,會出現一些奇奇怪怪的問題...

關於這些問題,其實高見龍有提出解決方法,這篇筆記主要只是針對這些方法再做出改進(只是有一些地方好像打錯這樣而已XD),說真的也沒啥新意,不過就是當我本人的小記事這樣。

下面因為主題是佈署到heroku上面,所以簡單的用scaffold產生隨隨便便的CRUD架構就好,root也不會更改,然後就丟上heroku打完收工。


使用Heroku和使用Github的觀念很像,都是把Heroku/Github視為一個遠端Repo,這樣想的話就可以把一切都兜起來了,Heroku比較特別的是說他有自己的gem,所以本來git開頭的commend改成heroku開頭,動作則都和做遠端Repo大同小異,這也是Heroku作為VPN,對Rails來說真是好用到爆的主因(也不用自己去佈署環境,相較起來我光是為了磨Rails101的ch.7去架Ubuntu12.04 server真是裝機裝到想哭...)。

◢▆▅▄▃▂▁崩╰(〒皿〒)╯潰▁▂▃▄▅▇◣ 送給ubuntu server deploy一個崩潰


先把heroku gem下來
對了,當然我們要先去Heroku本站sign up,雖然我忘記講了,但是這應該很基本不用多講吧(不然誰知道你那位XD)

$ gem install heroku

接下來,創建一個遠端heroku Repo
$ heroku create [name]
#[name]可有可無,若不輸入heroku會自己給一個名稱,若有的話則不能與heroku上面現有的名稱相同。
#也可以創完以後再到heroku後台修改

在此假設local已經有了一個git Repo,然後就是cd到此local Repo底下,告訴他他多了一個心電感應對象 --
$ git remote add heroku git@heroku.com:[name].git
#當然remote的名字也可以隨便取不一定要叫作heroku,但是好像也沒別的理由取其他名字...

然後,不意外的,我們要push上去
$ git push heroku master

然後這裡就是比較神奇的地方了,heroku上面也需要migrate!
$ heroku rake db:migrate

基本上,以前到這裡應該就輕輕鬆鬆的佈署好我們的專案了,只要打上"http://[name].heroku.com/"應該就可以到root底下察看我們push上去的application,然而當Rails漸漸的進化到3以後,好像就沒有這麼順利囉...



最重要的部份是「問題」


問題是呢,到了Rails 3以後的版本,靜態檔案會動態產生,可是Heroku沒有辦法讓我們這麼做,所以就要搞剛的再多加上些手腳--precompile,這時候你會覺得很奇怪,因為Ruby是dynamic language,為什麼要compile咧?嗯,這件事以後再說。
$ rake assets:precompile RAILS_EVN=production
$ git add .
$ git commit -m 'blah blah blah'
$ git push heroku master

除外,很有可能我們在上一步中做
$ heroku rake db:migrate 

的時候就已經產生錯誤,這時候你需要去Gemfile裏面加東西:
group :product do
   gem "pg"
end

然後再bundle一次就可以了
$ bundle install --without production 

2 則留言:

  1. 如果想動態compile 可以參考, 官方文件 https://devcenter.heroku.com/articles/rails3x-asset-pipeline-cedar#the_asset_pipeline

    因為Rails 預設是不允許這種行為的, 所以要自己打開
    Rails.application.config.assets.compile = true

    回覆刪除