What have you found for these years?

2008-12-06

臭 merb (2)

昨天睡前左思右想(就差沒開機實驗了...),想到幾個比較好的作法。
除了 dependency 多到鬼扯這我沒辦法外,其他基本上都有一些撇步可以解決。

像是 invoke rake 居然需要讀取 dependency, 修改 Rakefile 即可。
把:


init_env = ENV['MERB_ENV'] || 'rake'
Merb.load_dependencies(:environment => init_env)

搬到 task :merb_env do 裡面就好了。真蠢,本來就該這樣不是嗎?
要讀取 env 時才需要讀取 dependency 吧。不過我猜 merb 的想法是
dependency 裡面有可能也有 task 要讀取,所以就都讀進來了。

不是這樣吧... orz

還有讀取 .rake 根本就是 Rakefile 裡面寫的,要遞迴就簡單加上 **/*.rake

server restart 一直有問題的問題,重新測試幾次後不曉得為什麼忽然就沒了 XD
總之雖然用 thin start 可以用 merb adapter, 但不建議這樣做...
原因就是他的 log 和 pid 檔會怪掉 :s 大概是 merb 後來又改東西,
然後 thin adapter 沒有跟上吧?

但是用 merb 啟動的話,又不能用 config. 於是我追加 merb task 到
app-deploy. merb.rake or master merb.rake
還順便把 thin/nginx/merb 的 config path 都拉 option 出來,
也重新調整 app:deploy 不要再 pull 也不要 install gem.
下一步大概就是作成 gem 吧,不要再丟到 lib/tasks/ 裡面。

github 除了很好很強大外,幾乎每天都在改,而且幾乎都是改得更好!
真是太讓人讚賞了... O_Q 現在檔案連結預設是 commit, 這樣可以保留
當時想給別人看的程式碼。如果要看 master, 自己改網址就好了,很好!
感覺 github 很有活力,有什麼不好或是怪怪的地方,很快就會修改了。
有時候還會改不好,最後又改回來 XD

上面的 merb task, stop 就簡單呼叫 merb -K all
我每次都忘記打那個 all, 結果就出現奇怪的錯誤訊息,
說找不到 merb.-a.pid 這個檔案 =_=b 害我一直覺得很奇怪,
想說設定檔哪裡寫錯,是不是 adapter 寫錯?(因為 -a 是 adapter 的選項)
忽然間才注意到原來是 all 「又」忘記打了。

start 則是讀取 config/merb.yml(還是應該改名為 config/server.yml?)
然後就單純把 adapter: thin 改寫成 --adapter thin 然後全串起來,
呼叫 merb --adapter thin --port 9100 之類的這樣。

我記得當初 merb 有說要做一個很厲害的東西,就是如果不能 bind 到
你選擇的那個 port 的話,merb 會停在那裡等待能夠 bind.
這就可以讓你 restart 不用寫成 stop => start, 而可以反過來寫成:
start => stop, 達成幾乎毫無間斷的 server rebooting.

不過後者的那個 stop 就不能寫成 merk -K all 了,不然連新的都殺了 XD
但我測試的結果是沒辦法,會報 FATAL: Could not bind to 9100
所以大概是還沒有寫好這種功能吧。不然又怎麼會有 merb -K all 的存在呢?
應該要有 merb --reboot 自動處理這件事才對。

我想這功能大概聽起來很神,實際上沒啥差,所以就還沒做吧。
畢竟如果是 cluster, 就一台一台切就好了。雖然這可能會造成切換的途中
使用者可能前後會看到不同的結果,因為遷移中嘛... XD
可能也是因為這樣,所以 mongrel_cluster 和 thin restart 都是
全關然後全開吧?不過我還是覺得一台一台切比較好,不然 cluster 一多,
全關就要一點時間了,這樣 down time 可能會太長...

還有,merb --fast-deploy 感覺沒用。我跑 production, 然後呼叫
--fast-deploy, 修改的 template 也沒反應出來。不過也是沒差,
反正 rake app:merb:restart 我都寫好了,thin 也是一直這樣用...

記憶體的部份,rails 約吃 55m, 看起來好像很多,其實 merb 更多...
master 和 worker 各自吃約 32m, 總和就是 64m 了。當然這是只比
單一 server, 跑 cluster 的話還沒試,就不知道了。只是跑些小案子,
實在沒有必要跑兩個以上的 server... 這樣 merb 就顯得比較吃記憶體了。

但 boot up 的時間,merb 大概只有 rails 的 1/4 ~ 1/3 吧。
這點 merb 真的大勝!使得 reboot 的成本變得低廉很多。



關於 log 的部份,開 :debug 超詳盡,連 /images/merb.jpg,
他都要先報告沒找到 images controller..... 這實在未免囉唆了點。
改開 :info 之後好多了,就只顯示 request info.

還有他 controller action 最後都要加 render 滿煩的...
試了內建的 after filter, 無效!改用 Extlib::Hook 也無效!
最後只好:

[:index, :rule].each{ |page|
define_method page do
render
end
}

有點蠢,不過如果有一堆靜態頁面需要套 layout, 大概就這樣做比較快。

anyway, so far so good. 一開始可能很難做得像 rails 這樣,
但相信慢慢調整可以調到比 rails 好。不過老實講,一開始我真的很認真在想,
要用 merb 嗎?這次這麼趕,是不是乾脆用 rails 還比較妥當?

不過一想到 rails 搭 datamapper 可能會不理想...
就還是用 merb 吧 ~.~ datamapper rules!

==
最後一個抱怨,rails 的 logo 比 merb 好看太多了...
而且 png 才是王道啊!!merb 用啥 jpg 啦!
rails 整張圖有紅寶石的結構,上面又有鐵道,延伸的透視不錯,
看起來非常遙遠,底下的文字也很整齊清楚,是少數我相當欣賞的 logo...

merb 完全比不上 orz

0 retries:

Post a Comment

Note: Only a member of this blog may post a comment.



All texts are licensed under CC Attribution 3.0