# 在 Gemfile 裡看到版本寫法有好幾款，各是代表什麼意思?

> 

Published: 2016-05-02
URL: https://kaochenlong.com/gemfile

---

隨便打開一個 Rails 專案底下的 `Gemfile` 檔案，大概會長得像這樣(以 Rails 5.0.0 beta 4 為例)：

```ruby
source &#39;https://rubygems.org&#39;

gem &#39;rails&#39;, &#39;&gt;= 5.0.0.beta4&#39;, &#39;&lt; 5.1&#39;
gem &#39;sqlite3&#39;
gem &#39;puma&#39;, &#39;~&gt; 3.0&#39;
gem &#39;sass-rails&#39;, &#39;~&gt; 5.0&#39;
gem &#39;uglifier&#39;, &#39;&gt;= 1.3.0&#39;
gem &#39;coffee-rails&#39;, &#39;~&gt; 4.1.0&#39;
gem &#39;jquery-rails&#39;
gem &#39;turbolinks&#39;, &#39;~&gt; 5.x&#39;
gem &#39;jbuilder&#39;, &#39;~&gt; 2.0&#39;

group :development, :test do
  gem &#39;byebug&#39;, platform: :mri
end

group :development do
  gem &#39;web-console&#39;
  gem &#39;listen&#39;, &#39;~&gt; 3.0.5&#39;
  gem &#39;spring&#39;
  gem &#39;spring-watcher-listen&#39;, &#39;~&gt; 2.0.0&#39;
end

# Windows does not include zoneinfo files, so bundle the tzinfo-data gem
gem &#39;tzinfo-data&#39;, platforms: [:mingw, :mswin, :x64_mingw, :jruby]
```

移除部份註解節省點空間。在這個例子裡，有些 gem 的後面有加註版本號碼，有的沒有，這些分別是代表什麼意思呢?

&lt;!--more--&gt;

## 沒加註版號

先從最簡單的來看。當後面沒有加註版本號碼的時候，像這樣：

```ruby
gem &#39;sqlite3&#39;
gem &#39;jquery-rails&#39;
```

這樣將會在安裝的時候選用「最新的穩定(stable)版本」，要注意這裡的重點是「穩定」而不是「最新」。以 Rails 來說，雖然目前最新的版本是 5.0.0 beta 4，但最新的「穩定」版本是 4.2.6 版，所以當沒有加註版本號的時候，它會安裝 4.2.6 版本。

## 加註明確版號

例如像這樣：

```ruby
gem &quot;rails&quot;, &quot;4.2.6&quot;
```

這相當明顯了，這就是說「我要安裝 rails 4.2.6 版」，應該不需要特別解釋。

## 大於、小於版號

```ruby
gem &#39;uglifier&#39;, &#39;&gt;= 1.3.0&#39;
```

我想這個光用看的就猜得出來，就是要選用大於或等於 1.3.0 版本。

```ruby
gem &#39;rails&#39;, &#39;&gt;= 5.0.0.beta4&#39;, &#39;&lt; 5.1&#39;
```

這樣則是會選用在 5.0.0.beta4 跟 5.1 之間的版本。

## 差不多...

```ruby
gem &#39;coffee-rails&#39;, &#39;~&gt; 4.1.0&#39;
```

這是指會選用 4.1.0 以上，但 4.2 以下(不含括 4.2)的最新版本。

為什麼這麼麻煩? 舉個例子來說，例如版本號 `4.2.6`，`4`、`2`、`6` 三個數字分別代表主要版號(Major)、次要版號(Minor)以及修訂版號(Patch)，分別表示：

* 主要版號：功能大改，公開的 API 做了不少修正，通常沒辦法向下不相容
* 次要版號：加了某些新功能，但不影響其它功能，向下相容
* 修訂版號：對現有的功能做了小幅度的修正，可向下相容

這是個不成文的規定(語義化版本)，雖然沒有強制，但幾乎大部份的 gem 作者都會依照這個規範。而這個 `~&gt;` 可以比較確保在進行 `bundle install` 指令的時候，因為只會更新到次要或修訂版號的套件，所以比較不會因為原作推出了最新力作(例如 5.0.0)，而把原本正常運作的系統弄壞了。

### 參考資料：

1. Bundler http://bundler.io/gemfile.html
2. 語意化版本 http://semver.org/lang/zh-TW/


