Docs header transparent bg

如何管理 gem 组

将依赖项分组允许您对整个组执行操作。

# 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_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 选择安装可选组。

将依赖项分组

有时您会有一些 gem 组,它们只有在特定环境中才有意义。例如,您可能会使用 SQLite 开发应用程序(在早期阶段),但使用 mysql2pg 部署它。在此示例中,您可能在开发机器上没有安装 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 需要一些时间,而您并不需要在每次启动应用程序时都加载它。