将依赖项分组允许您对整个组执行操作。
# 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
调用将安装所有 gem,除了列出的组中的 gem。至少在一个非排除组中的 gem 仍将被安装。
$ bundle config set --local without test development
在特定组中需要 gem,注意不在命名组中的 gem 位于 :default 组中
Bundler.require(:default, :development)
需要默认 gem,以及与当前 Rails 环境同名的组中的 gem
Bundler.require(:default, Rails.env)
限制要添加到加载路径的 gem 组。只有这些组中的 gem 才能被 require。但请注意,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
选择安装可选组。
有时您会有一些 gem 组,它们只有在特定环境中才有意义。例如,您可能会使用 SQLite 开发应用程序(在早期阶段),但使用 mysql2
或 pg
部署它。在此示例中,您可能在开发机器上没有安装 MySQL 或 Postgres,并且希望 Bundler 跳过它。
为此,您可以将依赖项分组
source 'http://rubygems.org.cn'
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
时,它将跳过生产 gem。类似地,当您需要 bundler/setup
时,Bundler 将忽略这些组中的 gem。您可以通过运行 bundle config
查看 Bundler 在那里保存的所有设置,它还会打印出全局设置(存储在 ~/.bundle/config
中)以及通过环境变量设置的设置。有关配置 Bundler 的更多信息,请参见:bundle_config
您还可以通过 Bundler.require
的参数指定要自动需要的组。:default
组包含所有未列在任何组下的 gem。如果您调用 Bundler.require(:default, :development)
,Bundler 将 require
:default
组中的所有 gem 以及 :development
组中的 gem。
默认情况下,Rails 生成的应用程序在您的 application.rb
中调用 Bundler.require(:default, Rails.env)
,这将您的 Gemfile
中的组链接到 Rails 环境。如果您使用其他组(未链接到 Rails 环境),则可以将它们添加到对 Bundler.require
的调用中,如果您希望它们被自动需要。
请记住,您可以始终将某些 gem 组从 Bundler.require
中排除,然后在应用程序的适当位置使用 Ruby 的 require
手动加载它们。您可能这样做是因为加载某个 gem 需要一些时间,而您并不需要在每次启动应用程序时都加载它。