Docs header transparent bg

如何管理寶石群組

將相依性分組,可對整個群組執行操作。

# These gems are in the :default group
gem 'nokogiri'
gem 'sinatra'

gem 'wirble', group: :development

group :test do
  gem 'faker'
  gem 'rspec'
end

group :test, :development do
  gem 'capybara'
  gem 'rspec-rails'
end

gem 'cucumber', group: [:cucumber, :test]

設定 bundler,讓後續的 bundle install 呼叫安裝所有寶石,但列出的群組除外。至少在一個非排除群組中的寶石仍會安裝。

$ bundle config set --local without test development

需要特定群組中的寶石,請注意,不在命名群組中的寶石屬於 :default 群組

Bundler.require(:default, :development)

需要預設寶石,加上與目前 Rails 環境同名的群組中的寶石

Bundler.require(:default, Rails.env)

限制要新增到載入路徑的寶石群組。只有這些群組中的寶石才能需要。但請注意,Bundler.setup 只可呼叫一次,後續所有呼叫都是無效操作。特別是,由於透過 bundle exec 執行指令碼已呼叫 Bundler.setup,因此使用者程式碼中後續的任何呼叫都會被忽略。若要控制由 bundle exec 載入的群組,可以使用 BUNDLE_WITHBUNDLE_WITHOUT 設定。

require 'bundler'
Bundler.setup(:default, :ci)
require 'nokogiri'

深入了解:Bundler.setup

選用群組和 BUNDLE_WITH

使用 group :name, optional: true do 將群組標示為選用,然後使用 bundle config set --local with name 選擇安裝選用群組。

將相依性分組

有時,您會有一些只在特定環境中才有意義的寶石群組。例如,您可能在早期階段使用 SQLite 開發應用程式,但使用 mysql2pg 部署應用程式。在此範例中,您的開發機器可能未安裝 MySQL 或 Postgres,而且您希望 bundler 略過它。

為此,您可以將相依性分組

source 'https://rubygems.org'

gem 'rails', '3.2.2'
gem 'rack-cache', require: 'rack/cache'
gem 'nokogiri', '~> 1.4.2'

group :development do
  gem 'sqlite3'
end

group :production do
  gem 'pg'
end

現在,在開發階段,您可以指示 bundler 略過 production 群組

$ bundle config set --local without production

Bundler 將旗標儲存在 APP_ROOT/.bundle/config 中,下次執行 bundle install 時,它會略過生產寶石。同樣地,當您需要 bundler/setup 時,Bundler 會忽略這些群組中的寶石。您可以透過執行 bundle config 查看 Bundler 在其中儲存的所有設定,這也會列印出全域設定(儲存在 ~/.bundle/config 中)和透過環境變數設定的設定。如需設定 Bundler 的更多資訊,請參閱:bundle_config

您也可以透過 Bundler.require 的參數指定要自動需要的群組。:default 群組包括未在任何群組中列出的所有寶石。如果您呼叫 Bundler.require(:default, :development),bundler 會 require :default 群組中的所有寶石以及 :development 群組中的寶石。

預設情況下,Rails 生成的應用程式會在您的 application.rb 中呼叫 Bundler.require(:default, Rails.env),這會將 Gemfile 中的群組連結到 Rails 環境。如果您使用其他群組(未連結到 Rails 環境),您可以將它們新增到 Bundler.require 的呼叫中,如果您想要它們自動載入的話。

請記住,您隨時可以將 gem 群組排除在 Bundler.require 之外,然後在應用程式的適當位置使用 Ruby 的 require 手動載入它們。您可能會這麼做,因為載入特定 gem 需要一些時間,而且您並不需要每次啟動應用程式時都載入它。

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