Docs header transparent bg

如何升級到 Bundler 2

因此!您已經聽說 Bundler 2 已發布!如果您想親自試用 Bundler 2,本指南將協助您執行此操作。

Bundler 2 幾乎與前一版本 1.17 完全相同。最大的變更在於 Bundler 現在至少需要 Ruby 2.3.0 和 RubyGems 2.5.0。

先決條件

在升級到 Bundler 2 之前,請確定您擁有正確的 Ruby 和 RubyGems。您需要使用 Ruby 2.3.0 或更高版本,並且需要安裝 RubyGems 2.5.0 或更高版本。

您可以透過執行 ruby --version 來檢查您的 Ruby 版本,並透過執行 gem --version 來檢查您的 RubyGems 版本。如果您需要升級 Ruby,請使用您的 Ruby 版本管理員的說明。如果您需要升級 RubyGems,請執行 gem update --system

一切都設定好了嗎?Ruby 和 RubyGems 版本夠新嗎?太好了。繼續吧。

安裝 Bundler 2

升級到 Bundler 2 的第一步是安裝 Bundler 2 寶石。若要以一般方式安裝,請執行 gem install bundler,RubyGems 會安裝 Bundler 的最新版本。

版本自動切換

現在您已經安裝了 Bundler 2,您應該知道 Bundler 會根據您的應用程式的 Gemfile.lock 在版本 1 和版本 2 之間自動切換。如果您的鎖定檔是由 Bundler 1 建立的,您的指令將由 Bundler 1 執行。如果您的鎖定檔是由 Bundler 2 建立的,您的指令將由 Bundler 2 執行。

以下是使用 Bundler 1.17.1 建立的 Gemfile.lock 範例。

GEM
  remote: https://rubygems.org/
  specs:
    rack (2.2.4)

PLATFORMS
  ruby

DEPENDENCIES
  rack

BUNDLED WITH
   1.17.1

Bundler 會讀取 BUNDLED WITH 區段中的 Bundler 版本,以決定應執行哪個 Bundler 版本。使用上述鎖定檔範例,Bundler 1 將會被使用,如您在此處所見

$ grep -A 1 "BUNDLED WITH" Gemfile.lock
BUNDLED WITH
   1.17.1

$ bundle version
Bundler version 1.17.1

當 Gemfile 是由 Bundler 2 建立,或由開發人員手動從 Bundler 1 升級到 Bundler 2 時,指令將由最新安裝的 Bundler 2 執行。以下是範例說明

$ grep -A 1 "BUNDLED WITH" Gemfile.lock
BUNDLED WITH
   2.0.0

$ bundle version
Bundler version 2.0.0

當 Bundler 在應用程式外部使用時,將始終使用最新安裝的版本。

$ ls -a
.	..

$ bundle version
Bundler version 2.0.0

將應用程式從 Bundler 1 升級到 Bundler 2

您現有的應用程式將繼續使用 Bundler 1。在您選擇執行之前,Bundler 絕不會將您的應用程式變更為新的主要版本。如果您的應用程式已準備好,您可以透過執行 bundle update --bundler 來將該應用程式升級到最新安裝的 Bundler 版本。

我們建議您在升級之前提交您的 Gemfile.lock。這樣,如果發生問題或無法正常運作,您隨時可以還原到先前的鎖定檔,並重新使用 Bundler 1。

在新的應用程式中使用 Bundler 2

當你使用 bundle initrails new 或類似的指令建立新的應用程式時,你的應用程式會使用目前已安裝的最新版 Bundler。如果你已安裝 Bundler 2,你的應用程式會鎖定到 Bundler 2。你可以透過閱讀鎖定檔,尋找名為 BUNDLED WITH 的區段來驗證這一點。

常見問題

為什麼 Bundler 會有自動版本切換?

許多 Ruby 開發人員的機器上有多個應用程式。如果我們強制一台機器上的所有應用程式都只能使用 Bundler 1 或 Bundler 2,這會讓所有人都感到非常痛苦。

版本切換讓所有人都可以在同一台機器上,同時讓某些應用程式使用 Bundler 1,而其他應用程式使用 Bundler 2。每個應用程式可以在最適合該特定應用程式的時間升級到 Bundler 2。

如果我的應用程式需要 Bundler 2,但我只安裝了 Bundler 1 會怎樣?

如果你嘗試在需要 Bundler 2 的應用程式上使用 Bundler 1,你會看到一個錯誤訊息,說明你需要安裝 Bundler 2。繼續執行 gem install bundler,然後它應該就可以正常運作。

如果我的應用程式需要 Bundler 1,但我只安裝了 Bundler 2 會怎樣?

如果你嘗試在需要 Bundler 1 的應用程式上使用 Bundler 2,而且你根本沒有安裝 Bundler 1,你會看到一個錯誤訊息,要求你安裝 Bundler 1。繼續執行 gem install bundler -v "~>1.0" 以安裝 Bundler 的最新 1.x 版本,然後再嘗試你的指令。

我可以將我的應用程式從 Bundler 2 降級到 Bundler 1 嗎?

Bundler 2 沒有提供將 Gemfile 降級回 Bundler 1 的方法。相反地,我們建議你在升級應用程式之前檢查你的 GemfileGemfile.lock。這樣,如果發生問題,你可以還原到前一個提交並繼續使用 Bundler 1。

將我的應用程式升級到 Bundler 2 時遇到問題

喔不!很抱歉。請前往我們的疑難排解指南並開啟一個問題,以便我們盡快嘗試解決您的問題。

Bundler 2 是否會有其他顯著變更?

Bundler 2 包含這些變更

  • 移除對已棄用 Ruby 版本(< 2.3)的支援
  • 移除對已棄用 RubyGems 版本(< 2.5.0)的支援
  • 將 Bundler 錯誤列印至 STDERR,而非 STDOUT
  • Gemfile 中的 github: 捷徑將使用 https,而非 http

我可以在 Heroku 上使用 Bundler 2 嗎?

可以!Heroku 團隊已將官方 Ruby buildpack 升級為支援 Bundler 2。請參閱Heroku 有關 Bundler 版本的文章以取得更多詳細資訊。

如果您發現錯誤或發現有遺漏之處,請在 GitHub 上編輯此文件