爬文都會說Gemfile是一個用來描述Gems與應用程式之間相依賴的文件。最簡單的說法就是, Gemfile掌管所有Gems套件的版本。所以當我們執行$ bundle install
時,Bundler會根據專案目錄中Gemfile裡設定的條件,檢查指定的Gem與相依套件是否已經安裝。
Rails 5.2.3版本為例
Gemfile檔案打開,內容大概會長這樣:
Gemfile檔案下方,會看到 :development、:development, :test、:test等等的 group,這是Gemfile將Gems另做環境分組,在專案的執行過程,包在group的Gems只會在指定的環境下被 require,這樣的作法,可以讓應用程式執行時避免require不必要的Gems,在整體專案執行速度上更優化。
development
development, test
test
先從最簡單的來看,沒有版本號碼的時候:
gem 'sqlite3'
這樣在安裝時,對 Rails 來說會選擇「最新的穩定(stable)版本」而不是「最新版本」。
有版本號的時候又可分成:
gem 'rails', '5.2.3' # 指定安裝 5.2.3 版本
gem 'uglifier', '>= 1.3.0' # 安裝大於等於 1.3.0 版本
gem 'listen', '>= 3.0.5', '< 3.2' # 安裝 3.0.5 ~ 3.2 之間的版本
gem 'coffee-rails', '~> 4.2' # 安裝4.2.x中的最新版本
其中~>
表示 4.2 以上,但 4.3 以下( 不包括 4.3 ) 的最新版本。 也可以確保未來不會因為套件升級而出現錯誤。
版本號通常用三個數字分別代表主要版號 (Major
)、次要版號 (Minor
)以及修訂版號 (Patch
)
以Rails5.2.3版本來說5、2、3 ,依序分別為:
主要版號 Major:功能大改,公開的 API 做了不少修正,通常沒辦法向下不相容
次要版號 Minor:加了某些新功能,但不影響其它功能,可向下相容
修訂版號 Patch:對現有的功能做了小幅度的修正,可向下相容
這是個不成文的規定(語義化版本),幾乎大部份的gem作者都會依照這個規範。
參考連結:
What is a Gemfile
Ruby 語法放大鏡之「在 Gemfile 裡看到版本寫法有好幾款,各是代表什麼意思?」
Ruby Gemfile 详解