Docs header transparent bg

bundle update

bundle-update - 將您的寶石更新至最新可用版本

bundle update *gems [--all]
                        [--group=NAME]
                        [--source=NAME]
                        [--local]
                        [--ruby]
                        [--bundler[=VERSION]]
                        [--full-index]
                        [--jobs=JOBS]
                        [--quiet]
                        [--patch|--minor|--major]
                        [--redownload]
                        [--strict]
                        [--conservative]

說明

更新指定的寶石(如果使用 --all 旗標,則更新所有寶石),忽略 Gemfile.lock 中指定的先前已安裝寶石。通常,您應該使用 bundle install(1) 在各台機器上安裝完全相同的寶石和版本。

您會使用 bundle update 明確更新寶石的版本。

選項

--all
更新 Gemfile 中指定的所有寶石。
--group=<name>, -g=[<name>]
僅更新指定群組中的寶石。例如,您可以使用 bundle update --group development 更新開發群組中的所有寶石。您也可以呼叫 bundle update rails --group test 來更新 rails 寶石和測試群組中的所有寶石,例如。
--source=<name>
Gemfile(5) 中使用的 :git:path 來源的名稱。例如,對於 http://github.com/rails/rails.git:git 來源,您會呼叫 bundle update --source rails
--local
不要嘗試遠端擷取寶石,而改用寶石快取。
--ruby
將 Ruby 的鎖定版本更新至 Ruby 的目前版本。
--bundler
將 bundler 的鎖定版本更新至呼叫的 bundler 版本。
--full-index
退回使用所有寶石的單一檔案索引。
--jobs=[<number>], -j[<number>]
指定要並行執行的作業數目。預設值是可用處理器的數目。
--retry=[<number>]
重試失敗的網路或 git 要求 number 次。
--quiet
僅輸出警告和錯誤。
--redownload
強制下載每個寶石。
--patch
偏好僅更新至下一個修補程式版本。
--minor
偏好僅更新至下一個次要版本。
--major
偏好更新至下一個主要版本(預設值)。
--strict
不允許任何寶石更新到最新的 --patch | --minor | --major
--conservative
使用 bundle 安裝保守更新行為,且不允許更新間接依賴項。

更新所有寶石

如果您執行 bundle update --all,bundler 將忽略任何先前安裝的寶石,並根據來源中所有寶石的最新版本再次解析所有依賴項。

考慮以下 Gemfile(5)

source "https://rubygems.org"

gem "rails", "3.0.0.rc"
gem "nokogiri"

當您第一次執行 bundle install(1) 時,bundler 將解析所有依賴項(一直到最底層),並安裝您需要的內容

Fetching gem metadata from https://rubygems.org/.........
Resolving dependencies...
Installing builder 2.1.2
Installing abstract 1.0.0
Installing rack 1.2.8
Using bundler 1.7.6
Installing rake 10.4.0
Installing polyglot 0.3.5
Installing mime-types 1.25.1
Installing i18n 0.4.2
Installing mini_portile 0.6.1
Installing tzinfo 0.3.42
Installing rack-mount 0.6.14
Installing rack-test 0.5.7
Installing treetop 1.4.15
Installing thor 0.14.6
Installing activesupport 3.0.0.rc
Installing erubis 2.6.6
Installing activemodel 3.0.0.rc
Installing arel 0.4.0
Installing mail 2.2.20
Installing activeresource 3.0.0.rc
Installing actionpack 3.0.0.rc
Installing activerecord 3.0.0.rc
Installing actionmailer 3.0.0.rc
Installing railties 3.0.0.rc
Installing rails 3.0.0.rc
Installing nokogiri 1.6.5

Bundle complete! 2 Gemfile dependencies, 26 gems total.
Use `bundle show [gemname]` to see where a bundled gem is installed.

正如您所見,即使您在 Gemfile(5) 中有兩個寶石,您的應用程式仍需要 26 個不同的寶石才能執行。Bundler 會記住它在 Gemfile.lock 中安裝的確切版本。下次您執行 bundle install(1) 時,bundler 會略過依賴項解析,並安裝與上次安裝相同的寶石。

Gemfile.lock 提交到版本控制並在另一部電腦上複製它後,執行 bundle install(1) 會安裝您上次安裝的寶石。您不必擔心 erubismail 的新版本會變更您使用的寶石。

但是,有時您可能想要將您使用的寶石更新到最新版本,這些版本仍與您 Gemfile(5) 中的寶石相符。

為執行此作業,請執行 bundle update --all,它會忽略 Gemfile.lock,並再次解析所有依賴項。請記住,此程序可能會導致 25 個寶石的集合有顯著不同,具體取決於寶石作者自您上次執行 bundle update --all 以來發布的新寶石的需求。

更新寶石清單

有時,您想要更新 Gemfile(5) 中的單一寶石,並將您指定的其餘寶石鎖定到 Gemfile.lock 中的版本。

例如,在上述情況中,想像 nokogiri 發佈了 1.4.4 版本,而您想要更新它而不用更新 Rails 和其所有依賴項。為此,請執行 bundle update nokogiri

Bundler 會更新 nokogiri 及其任何依賴項,但不會更新 Rails 及其依賴項。

重疊的依賴項

有時,您在 Gemfile(5) 中宣告的多個 gem 會由同一個第二層級依賴項滿足。例如,考慮 thinrack-perftools-profiler 的情況。

source "https://rubygems.org"

gem "thin"
gem "rack-perftools-profiler"

thin gem 依賴於 rack >= 1.0,而 rack-perftools-profiler 依賴於 rack ~> 1.0。如果您執行 bundle install,您會得到

Fetching source index for https://rubygems.org/
Installing daemons (1.1.0)
Installing eventmachine (0.12.10) with native extensions
Installing open4 (1.0.1)
Installing perftools.rb (0.4.7) with native extensions
Installing rack (1.2.1)
Installing rack-perftools_profiler (0.0.2)
Installing thin (1.2.7) with native extensions
Using bundler (1.0.0.rc.3)

在這種情況下,這兩個 gem 有自己的依賴項集合,但它們共用 rack。如果您執行 bundle update thin,bundler 會更新 daemonseventmachinerack,它們是 thin 的依賴項,但不會更新 open4perftools.rb,它們是 rack-perftools_profiler 的依賴項。請注意,bundle update thin 會更新 rack,即使它也是rack-perftools-profiler 的依賴項。

簡而言之,預設情況下,當您使用 bundle update 更新 gem 時,bundler 會更新該 gem 的所有依賴項,包括那些也是另一個 gem 的依賴項的依賴項。

若要防止更新間接依賴項,在 1.14 版之前,唯一的選項是在 bundle install(1) 中使用 CONSERVATIVE UPDATING 行為。

在這種情況下,手動在 Gemfile(5) 中更新 thin 版本,然後執行 bundle install(1),只會更新 daemonseventmachine,但不會更新 rack。有關更多資訊,請參閱 bundle install(1)CONSERVATIVE UPDATING 部分。

從 1.14 版開始,指定 --conservative 選項也會防止更新間接依賴項。

修補程式層級選項

版本 1.14 引入了 4 個修補程式層級選項,這些選項會影響 gem 版本的解析方式。下列選項之一可用:--patch--minor--major--strict 可進一步影響解析。

--patch
偏好僅更新至下一個修補程式版本。
--minor
偏好僅更新至下一個次要版本。
--major
偏好更新至下一個主要版本(預設值)。
--strict
不允許任何寶石更新到最新的 --patch | --minor | --major

當 Bundler 解析要使用哪些版本來滿足 Gemfile 或父 gem 中宣告的需求時,它會查詢所有可用的版本,篩選出任何不滿足需求的版本,然後在預設情況下,將它們從最新排序到最舊,並按此順序考慮它們。

提供其中一個修補程式層級選項(例如 --patch)會變更滿足版本的排序順序,導致 Bundler 在其他版本之前考慮最新的 --patch--minor 版本。請注意,如果需要找到合適的依賴關係圖,仍可以解析超出所述修補程式層級的版本。

例如,如果 gem 'foo' 已鎖定在 1.0.2,且 Gemfile 中未定義 gem 需求,且版本 1.0.3、1.0.4、1.1.0、1.1.1、2.0.0 全部存在,則預設偏好順序(--major)將為「2.0.0、1.1.1、1.1.0、1.0.4、1.0.3、1.0.2」。

如果使用 --patch 選項,偏好順序將變更為「1.0.4、1.0.3、1.0.2、1.1.1、1.1.0、2.0.0」。

如果使用 --minor 選項,偏好順序將變更為「1.1.1、1.1.0、1.0.4、1.0.3、1.0.2、2.0.0」。

--strict 選項與任何修補程式層級選項結合使用,將移除修補程式層級選項範圍之外的任何版本,以確保沒有 gem 更新得那麼遠。

要繼續之前的範例,如果同時使用 --patch--strict 選項,可供解析的版本將為「1.0.4、1.0.3、1.0.2」。如果使用 --minor--strict,則將為「1.1.1、1.1.0、1.0.4、1.0.3、1.0.2」。

Gemfile 中定義的 gem 需求仍將是決定哪些版本可用的第一個決定因素。如果 Gemfile 中 foo 的 gem 需求為 '~> 1.0',則這將完成與提供 --minor--strict 選項相同的事情。

修補程式層級範例

給定下列 gem 規格

foo 1.4.3, requires: ~> bar 2.0
foo 1.4.4, requires: ~> bar 2.0
foo 1.4.5, requires: ~> bar 2.1
foo 1.5.0, requires: ~> bar 2.1
foo 1.5.1, requires: ~> bar 3.0
bar with versions 2.0.3, 2.0.4, 2.1.0, 2.1.1, 3.0.0

Gemfile

gem 'foo'

Gemfile.lock

foo (1.4.3)
  bar (~> 2.0)
bar (2.0.3)

案例

#  Command Line                     Result
------------------------------------------------------------
1  bundle update --patch            'foo 1.4.5', 'bar 2.1.1'
2  bundle update --patch foo        'foo 1.4.5', 'bar 2.1.1'
3  bundle update --minor            'foo 1.5.1', 'bar 3.0.0'
4  bundle update --minor --strict   'foo 1.5.0', 'bar 2.1.1'
5  bundle update --patch --strict   'foo 1.4.4', 'bar 2.0.4'

在案例 1 中,bar 升級到 2.1.1,這是次要版本增加,因為 foo 1.4.5 的依賴關係需要它。

在情況 2 中,只有 foo 被要求解鎖,但 bar 也被允許移動,因為它不是 Gemfile 中宣告的依賴項。

在情況 3 中,bar 上升一個主要版本,因為現在 foo 偏好次要版本,當它升到 1.5.1 時,它需要 bar 的 3.0.0。

在情況 4 中,foo 偏好次要版本,但 1.5.1 無法使用,因為 --strict 標記從考量中移除 bar 3.0.0,因為它是一個主要版本。

在情況 5 中,foo 和 bar 都因為 --strict 標記而從考量中移除次要或主要版本,因此它們最多只能移動到 1.4.4 和 2.0.4。

一般來說,在使用 bundler 管理應用程式時,您應該使用下列工作流程

  • 第一次建立 Gemfile(5) 後,執行

    $ bundle install

  • 將產生的 Gemfile.lock 提交到版本控制

    $ git add Gemfile.lock

  • 在另一部開發機器上結帳這個儲存庫時,執行

    $ bundle install

  • 在部署機器上結帳這個儲存庫時,執行

    $ bundle install --deployment

  • 在變更 Gemfile(5) 以反映新的或更新的依賴項後,執行

    $ bundle install

  • 請務必將更新後的 Gemfile.lock 提交到版本控制

    $ git add Gemfile.lock

  • 如果 bundle install(1) 回報衝突,請手動更新您在 Gemfile(5) 中變更的特定 gem

    $ bundle update rails thin

  • 如果您想將所有 gem 更新到最新的可能版本,仍然符合 Gemfile(5) 中列出的 gem,請執行

    $ bundle update --all