為什麼 Rails 101 的新版拖這麼久...
這篇文章主要是寫給有興趣知道為什麼 Rails 101 區區一兩百頁,但是為什麼更新拖這麼久的關係。
寫這本書的難度非常非常之高,所以最後一刻我決定這本書如果不漲價,實在是....
寫作工具
首先是寫作工具的問題,技術書籍寫作門檻非常的高。我在 [電子出版] Rails 101 的兩年來的一些數據 提過:為了寫這本書,我換了好幾個平台,重寫了好幾遍。最後才選定 Leanpub 作為最後一次發佈的平台。
新 Feature 的問題
Rails 101 第一次的發佈是在 2011 的 6 月。那時候 Rails 是 3.0。
坦白來說後面的更新帶給我很大的壓力,主要是 Rails 3.0 -> Rails 3.2 新增了很多主題,有一些主題很不穩定(如 asset pipeline, strong parameter),不知道如何以「簡單的方式」更新進去書裡面。
Rails 安裝環境 的問題
再來就是安裝環境,這其實是最討人厭的,MacOSX 上的架構從 10.6 -> 10.7 -> 10.8 -> 10.9,每一個世代的 command line 安裝方式都不一樣,而且竟然還從 gcc 改到 clang。而 10.6, 10.7, 10.8 是「並存」的作業系統。我完全對如何寫一個「不太會爆炸的 ruby 環境建構」沒什麼頭緒。
Yehuda Katz 當時要解決這個問題的野望 rails.app
,到現在還沒 Official Release : http://www.kickstarter.com/projects/1397300529/railsapp/posts。而這兩年時間,Rails 從 3.0.0 衝到了 4.0.1,Ruby 從 1.8.7 改朝換代到 2.0.0。
同樣的問題也發生在 production deploy。從單一版本 ree 到 rvm 到 rbenv ...。很難為了系統環境變一次,書就改版一次。
Ruby 與 Rails 改朝換代的 dependency hell
對舊開發者沒太大影響
說實話,Ruby 與 Rails ,自從 Ruby 進了 1.9.2+ 之後,Ruby syntax 接近相當穩定。Rails 3.2 以後,Rails syntax 也很穩定。基本上如果單就「內容」來說,沒什麼要改的。所以如果已經是 Rails developer,根本沒什麼影響。
版本跳躍的連鎖反應
但問題就在於 Ruby 1.9.2 -> Ruby 2.0.0 與 Rails 3.2 -> Rails 4.0 的 jump 版所造成的 dependency hell。這本書是一本教學書,作者(應該)有責任讓這本書的程式碼能動。
Ruby 版本的跳躍,導致了很多 gem 改版,因為 require 的方式與位置不一樣了
。加上 Rails 3 -> Rails 4 的 gem 架構不太一樣
,gem 之間可能有 dependency 關係...
所以 Rails 101 v2 裡面首次發佈的 pdf 裡面 Gemfile 裡面幾乎都是 github 上的 trunk 版。讓特定版本在當時那個特定時間點會動...
熱門 Gem 偷改版
因為 Framekwork 改主板號 3->4 ,所以熱門 gem 也跟著流行改自己的主板號,同時偷偷「大改版」。如 simple_form 跳到 3.0。devise 也跳到 3.0。
這跳一個版號通常就是架構大變更。然後有一些 hack 就不能用了 -_-
Compass 與 Sprocekt 間無止盡的戰爭
compass 傳說中與 sprocket (asset pipeline 底層),兩個官方 team 素來有世仇。(只要你解過 asset pipeline 上的 issue, 追過幾串討論串, 你應該會聞得出來那種火花味, 雙方應該接近見面可能會打起來...)
但問題是:兩個都是超熱門套件。sprocket 佔了 Rails 內建的先天優勢,一直偷整 compass。但 compass-rails 幾乎也是一個 Rails developer 幾乎離不開的 gem。為了「與 Rails4相容」,從 Rails 4.0.0beta1, Rails 4.0.0rc1, Rails 4.0.0 official,compass-rails能夠動的版本,「完全不一樣」,甚至只存在討論串上的某個 fork 的某個 rev。
不過這不是 compass-rails 的錯,因為耐心追討論串你會發現從頭到尾都是 sprocket team 接近在整人。
Anyway 這問題不解,在 Rails project 不要說 deploy 了,連掛 compass 都有困難...
書裡面只要有 compass-rails,我就要保證它能動...-_-
Deploy Setting
sprocket 改了底層,於是在 deploy 時一些設定完全與 Rails 3 不同。從 Gemfile 擺放位置的順序到 production.rb 上的設定完全不一樣...
為了解決這些問題我花了好幾天時間在追討論串並且想辦法找 fix。
新觀念的引進與 Hack
Rails 3.0 -> Rails 4.0 間引進了一些新觀念以及新寫法,如
- Asset Pipeline
- Strong Parameter
這些都是其他 Framework 聞所未聞的設計,要在相當短的篇幅裡面寫出一篇 introduction,難度很高...
(還好以前寫過一些文章)
新觀念的引進與熱門 Gem 的糾葛
Strong Parameter 現在是預設的設計,但是會與 devise 衝突,解法是在 devise 的 issue 上翻到的...-_-
還要解釋為什麼要這樣繞過去...
舊的熱門 Feature 被改成詏手的 syntax
scope 從原先漂亮的 scope :recent, order("id DESC")
改成 scope :recent, -> { order("id DESC"}
改成
routing 的 secure 設計
以往 Rails 3
改成
這些變更有些可以穩定支援,跳 warning,有些 Rails 4 直接禁用 或行為不同。
Summary
而這些的 solution 都要去翻幾十個 issue 才知道發生什麼事,找出一個可以動的版本。然後在自己實驗的 project 上跑步驟確認這些 hack 真正能動,再整理成一本「不會爆炸」的指南。
嗯,我想我真的在做良心事業...-_-
全球應該沒人像我這麼神經病了。