高見龍

iOS app/Ruby/Rails Developer & Instructor, 喜愛非主流的新玩具 :)

Ruby 語法放大鏡之「在 Gemfile 裡看到版本寫法有好幾款,各是代表什麼意思?」

Ruby 語法放大鏡」系列短文主要是針對在大家學習 Ruby 或 Rails 時看到一些神奇但不知道用途的語法介紹,希望可以藉由這一系列的短文幫大家更容易的了解到底 Ruby 或 Rails 是怎麼回事。

隨便打開一個 Rails 專案底下的 Gemfile 檔案,大概會長得像這樣(以 Rails 5.0.0 beta 4 為例):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
source 'https://rubygems.org'

gem 'rails', '>= 5.0.0.beta4', '< 5.1'
gem 'sqlite3'
gem 'puma', '~> 3.0'
gem 'sass-rails', '~> 5.0'
gem 'uglifier', '>= 1.3.0'
gem 'coffee-rails', '~> 4.1.0'
gem 'jquery-rails'
gem 'turbolinks', '~> 5.x'
gem 'jbuilder', '~> 2.0'

group :development, :test do
  gem 'byebug', platform: :mri
end

group :development do
  gem 'web-console'
  gem 'listen', '~> 3.0.5'
  gem 'spring'
  gem 'spring-watcher-listen', '~> 2.0.0'
end

# Windows does not include zoneinfo files, so bundle the tzinfo-data gem
gem 'tzinfo-data', platforms: [:mingw, :mswin, :x64_mingw, :jruby]

移除部份註解節省點空間。在這個例子裡,有些 gem 的後面有加註版本號碼,有的沒有,這些分別是代表什麼意思呢?

沒加註版號

先從最簡單的來看。當後面沒有加註版本號碼的時候,像這樣:

1
2
gem 'sqlite3'
gem 'jquery-rails'

這樣將會在安裝的時候選用「最新的穩定(stable)版本」,要注意這裡的重點是「穩定」而不是「最新」。以 Rails 來說,雖然目前最新的版本是 5.0.0 beta 4,但最新的「穩定」版本是 4.2.6 版,所以當沒有加註版本號的時候,它會安裝 4.2.6 版本。

加註明確版號

例如像這樣:

1
gem "rails", "4.2.6"

這相當明顯了,這就是說「我要安裝 rails 4.2.6 版」,應該不需要特別解釋。

大於、小於版號

1
gem 'uglifier', '>= 1.3.0'

我想這個光用看的就猜得出來,就是要選用大於或等於 1.3.0 版本。

1
gem 'rails', '>= 5.0.0.beta4', '< 5.1'

這樣則是會選用在 5.0.0.beta4 跟 5.1 之間的版本。

差不多…

1
gem 'coffee-rails', '~> 4.1.0'

這是指會選用 4.1.0 以上,但 4.2 以下(不含括 4.2)的最新版本。

為什麼這麼麻煩? 舉個例子來說,例如版本號 4.2.6426 三個數字分別代表主要版號(Major)、次要版號(Minor)以及修訂版號(Patch),分別表示:

  • 主要版號:功能大改,公開的 API 做了不少修正,通常沒辦法向下不相容
  • 次要版號:加了某些新功能,但不影響其它功能,向下相容
  • 修訂版號:對現有的功能做了小幅度的修正,可向下相容

這是個不成文的規定(語義化版本),雖然沒有強制,但幾乎大部份的 gem 作者都會依照這個規範。而這個 ~> 可以比較確保在進行 bundle install 指令的時候,因為只會更新到次要或修訂版號的套件,所以比較不會因為原作推出了最新力作(例如 5.0.0),而把原本正常運作的系統弄壞了。

參考資料:

  1. Bundler http://bundler.io/gemfile.html
  2. 語意化版本 http://semver.org/lang/zh-TW/

Comments