建立 Rails 新專案時 (以 5.2.3 為例),接著開啟專案中「Gemfile」檔案:
會發現第 1–2 行寫著如下:
source ‘https://rubygems.org'
git_source(:github) { |repo| “https://github.com/#{repo}.git" }
Gemfile 需要至少一個 gem 來源,以 RubyGems 伺服器 URL 格式來說,透過執行產生具有預設 rubygems.org 的 Gemfile bundle init
,請使用https
以便使用 SSL 驗證與 rubygems.org 的連結。
往下看,發現下面程式碼起手式大部分為gem
和group
開頭:
先從gem
開頭介紹每個版本的涵義:
沒寫版本:
gem ‘sqlite3’
gem ‘spring’
安裝時選用「最新的穩定版本」,重點在「穩定」而非「最新」。
有寫版本:
ruby '2.6.3'
如看到所說,「我要安裝Ruby 2.6.3 版本」。
大於等於、小於:
gem ‘uglifier’, ‘>= 1.3.0’
安裝大於等於 1.3.0 版本。
gem ‘listen’, ‘>= 3.0.5’, ‘< 3.2’
安裝大於等於 3.0.5 及小於 3.2 的版本。
差不多
gem ‘rails’, ‘~> 5.2.3’
安裝 5.2.3 以上,但 5.3 以下(不含5.3)的最新版本。
放在 group 中:
group :development, :test do
(略)
end
只在開發(:development)、測試(:test)環境中能使用,像是 spring (可看上篇文章),網站上線時不需讓使用者看到、用到,就會寫在這裡面。
只想單獨讓開發(:development)或測試(:test)使用,可各別寫在對應的 group內喔。
說到 Gemfile 一定要介紹下 RubyGems,上面提供許多好用的 Gem 套件可供使用,像是bootstrap、faker、simple_form、devise、hirb-unicode、rspec-rails、factory_bot_rails…等,使用前記得先翻閱文件,會更清楚如何使用
如何新增 gem 呢?
RubyGems 搜尋需要的 gem 並加入 Gemfile 中,接著再終端機輸入
bundle install
或
bundle
就能使用囉~ (有些 gem 要將 server 重啟喔,記得看文件(很重要講三次))
打開看 Gemfile.lock 檔案,會發現目前所有套件的快照檔已被存下來
未來 bundle 時,會根據快照檔 Gemfile.lock 決定 Gemfile 是否有修改來進行套件更新
為什麼要這麼麻煩?
不如說這是貼心的代價,以版本 5.2.3
為例,5
、2
、3
三個數字分別代表主要版號(Major)、次要版號(Minor)、修訂版號(Path),表示如下:
主要版號:功能大改,公開的 API 做了不少修正,不一定能向下相容。
次要版號:加入某些新功能,但不影響其它功能,能向下相容。
修訂版號:對現有的功能做小幅度修正,可向下相容。
若沒有版本控制,每次都安裝最新版,導致舊版或某些 API 不相容或產生衝突時,通往「相依性地獄」的死亡之谷將給你滿滿地絕望…