將相依性分組,可對整個群組執行操作。
# 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_WITH
和 BUNDLE_WITHOUT
設定。
require 'bundler'
Bundler.setup(:default, :ci)
require 'nokogiri'
BUNDLE_WITH
使用 group :name, optional: true do
將群組標示為選用,然後使用 bundle config set --local with name
選擇安裝選用群組。
有時,您會有一些只在特定環境中才有意義的寶石群組。例如,您可能在早期階段使用 SQLite 開發應用程式,但使用 mysql2
或 pg
部署應用程式。在此範例中,您的開發機器可能未安裝 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 需要一些時間,而且您並不需要每次啟動應用程式時都載入它。