Docs header transparent bg

bundle install

bundle-install - 安装 Gemfile 中指定的依赖项

bundle install [--binstubs[=DIRECTORY]]
                 [--clean]
                 [--deployment]
                 [--frozen]
                 [--full-index]
                 [--gemfile=GEMFILE]
                 [--jobs=NUMBER]
                 [--local]
                 [--no-cache]
                 [--no-prune]
                 [--path PATH]
                 [--prefer-local]
                 [--quiet]
                 [--redownload]
                 [--retry=NUMBER]
                 [--shebang]
                 [--standalone[=GROUP[ GROUP...]]]
                 [--system]
                 [--trust-policy=POLICY]
                 [--with=GROUP[ GROUP...]]
                 [--without=GROUP[ GROUP...]]

描述

安装 Gemfile(5) 中指定的 gem。如果这是您第一次运行 bundle install(并且不存在 Gemfile.lock),Bundler 将获取所有远程源,解析依赖项并安装所有需要的 gem。

如果存在 Gemfile.lock,并且您没有更新 Gemfile(5),Bundler 将获取所有远程源,但使用 Gemfile.lock 中指定的依赖项,而不是解析依赖项。

如果存在 Gemfile.lock,并且您更新了 Gemfile(5),Bundler 将对您未更新的 gem 使用 Gemfile.lock 中的依赖项,但会重新解析您更新的 gem 的依赖项。您可以在下面 保守更新 部分找到有关此更新过程的更多信息。

选项

--clean--deployment--frozen--no-prune--path--shebang--system--without--with 选项已弃用,因为它们只有在自动应用于每个后续 bundle install 运行时才有意义,而这需要 bundler 静默地记住它们。由于 bundler 在未来版本中将不再记住 CLI 标志,因此应使用 bundle config(参见 bundle-config(1))来永久应用它们。

--binstubs[=<directory>]
Binstubs 是围绕可执行文件进行包装的脚本。Bundler 创建一个小的 Ruby 文件(一个 binstub),它加载 Bundler,运行命令,并将其放在 bin/ 中。这使您可以将 binstub 链接到应用程序内部,以使用应用程序所需的特定 gem 版本。

创建一个目录(默认为 ~/bin)并将 gem 中的任何可执行文件放在那里。这些可执行文件在 Bundler 的上下文中运行。如果使用,您可能需要将此目录添加到环境的 PATH 变量中。例如,如果 rails gem 带有一个 rails 可执行文件,则此标志将创建一个 bin/rails 可执行文件,确保所有引用的依赖项都将使用捆绑的 gem 进行解析。

--clean
在完成安装后,Bundler 将删除当前 Gemfile(5) 中不存在的任何 gem。不用担心,当前正在使用的 gem 不会被删除。

此选项已弃用,建议使用 clean 设置。

--deployment
部署模式 下,Bundler 将为生产或 CI 使用“推出”捆绑包。请仔细检查您是否希望在开发环境中启用此选项。

此选项已弃用,建议使用 deployment 设置。

--redownload
强制下载每个 gem,即使本地已存在所需版本。
--frozen
在安装后不允许更新 Gemfile.lock。如果要更改 Gemfile.lock,则退出非零值。

此选项已弃用,建议使用 frozen 设置。

--full-index
Bundler 不会调用 Rubygems 的 API 端点(默认),而是下载并缓存所有 gem 的索引文件(目前很大)。对于很少更改的大型捆绑包,启用此选项可以提高性能。
--gemfile=<gemfile>
Bundler 应该使用的 Gemfile(5) 的位置。默认情况下,它位于当前工作目录中的 Gemfile(5)。通常,Bundler 会假设 Gemfile(5) 的位置也是项目的根目录,并尝试在此位置找到 Gemfile.lockvendor/cache
--jobs=[<number>], -j[<number>]
并行下载和安装作业的最大数量。默认值为可用处理器的数量。
--local
不要尝试连接到 rubygems.org。相反,Bundler 将使用已存在于 Rubygems 缓存或 vendor/cache 中的 gem。请注意,如果 rubygems.org 上存在适当的平台特定 gem,则不会找到它。
--prefer-local
在解析时强制使用本地安装的 gem 或已存在于 Rubygems 缓存或 vendor/cache 中的 gem,即使远程存在更新的版本。仅尝试连接到 rubygems.org 以获取本地不存在的 gem。
--no-cache
不要使用新捆绑的 gem 更新 vendor/cache 中的缓存。这不会删除缓存中的任何 gem,但会阻止新捆绑的 gem 在安装过程中被缓存。
--no-prune
安装完成后,不要从缓存中删除过时的 gem。

此选项已弃用,建议使用 no_prune 设置。

--path=<path>
指定安装指定 gem 的位置。默认情况下,此选项使用 Rubygems 的设置。Bundler 与 Rubygems 共享此位置,gem install ... 也会将 gem 安装到此位置。因此,没有使用 --path ... 设置安装的 gem 将通过调用 gem list 显示。相应地,安装到其他位置的 gem 不会列出。

此选项已弃用,建议使用 path 设置。

--quiet
不将进度信息打印到标准输出。相反,Bundler 将使用状态代码 ($?) 退出。
--retry=[<number>]
对失败的网络或 git 请求重试 number 次。
--shebang=<ruby-executable>
使用指定的 ruby 可执行文件(通常为 ruby)来执行使用 --binstubs 创建的脚本。此外,如果您将 --binstubs--shebang jruby 一起使用,这些可执行文件将更改为执行 jruby

此选项已弃用,建议使用 shebang 设置。

--standalone[=<list>]
创建一个可以在运行时不依赖 Rubygems 或 Bundler 的 bundle。必须指定要安装的组的空格分隔列表。Bundler 创建一个名为 bundle 的目录并将 bundle 安装到该目录。它还会生成一个 bundle/bundler/setup.rb 文件,以替换 Bundler 自身的设置,以满足所需的方式。使用此选项会隐式设置 path,它是一个 [记住的选项][REMEMBERED OPTIONS]。
--system
将 bundle 中指定的 gem 安装到系统的 Rubygems 位置。这将覆盖之前对 --path 的任何配置。

此选项已弃用,建议使用 system 设置。

--trust-policy=[<policy>]
应用 Rubygems 安全策略 policy,其中 policy 是 HighSecurityMediumSecurityLowSecurityAlmostNoSecurityNoSecurity 之一。有关更多详细信息,请参阅下面 SEE ALSO 中链接的 Rubygems 签名文档。
--with=<list>
一个空格分隔的组列表,引用要安装的 gem。如果给出了一个可选组,则会安装它。如果给出了一个组,该组在之前给出的 --without 的记住的组列表中,则会从该列表中删除它。

此选项已弃用,建议使用 with 设置。

--without=<list>
一个用空格分隔的组列表,用于引用在安装过程中跳过的 gem。如果给定的组在之前使用 --with 给定的组列表中,则将其从该列表中删除。

此选项已弃用,建议使用 without 设置。

部署模式

Bundler 的默认设置针对开发进行了优化。要切换到针对部署和 CI 优化的默认设置,请使用 --deployment 标志。不要在开发机器上激活部署模式,因为它会在修改 Gemfile(5) 时导致错误。

  1. 需要 Gemfile.lock

    为了确保在部署中使用与开发和测试时相同的 gem 版本,需要 Gemfile.lock

    这主要是为了确保您记得将 Gemfile.lock 提交到版本控制中。

  2. Gemfile.lock 必须是最新的

    在开发中,您可以修改您的 Gemfile(5) 并重新运行 bundle install保守地更新 您的 Gemfile.lock 快照。

    在部署中,您的 Gemfile.lock 应该与您在 Gemfile(5) 中所做的更改保持一致。

  3. gem 安装到 vendor/bundle 而不是您的默认系统位置

    在开发中,与系统上的其他应用程序和其他脚本共享应用程序中使用的 gem 很方便。

    在部署中,隔离是一个更重要的默认设置。此外,部署应用程序的用户可能没有权限将 gem 安装到系统中,或者 Web 服务器可能没有权限读取它们。

    因此,bundle install --deployment 将 gem 安装到应用程序的 vendor/bundle 目录中。这可以通过使用 --path 选项来覆盖。

安装组

默认情况下,bundle install 将安装 Gemfile(5) 中所有组中的所有 gem,除了为不同平台声明的 gem 之外。

但是,您可以明确地告诉 Bundler 使用 --without 选项跳过安装某些组。此选项接受一个用空格分隔的组列表。

虽然--without选项会跳过安装指定组中的 gem,但它仍然会下载这些 gem 并使用它们来解析 GemfileGemfile(5)中每个 gem 的依赖项。

这样做的目的是,在另一台机器(例如生产服务器)上安装不同的组集时,不会改变您已经开发和测试过的 gem 和版本。

Bundler 提供了一个坚如磐石的保证,即您在开发和测试中运行的第三方代码也是您在生产中运行的第三方代码。您可以选择在不同的环境中排除一些代码,但您永远不会因为在不同的环境中使用不同版本的第三方代码而措手不及。

为了简单说明,请考虑以下 GemfileGemfile(5)

source 'https://rubygems.org.cn'

gem 'sinatra'

group :production do
  gem 'rack-perftools-profiler'
end

在这种情况下,sinatra 依赖于任何版本的 Rack(>= 1.0),而 rack-perftools-profiler 依赖于 1.x(~> 1.0)。

当您在开发环境中运行 bundle install --without production 时,我们也会查看 rack-perftools-profiler 的依赖项。这样,您就不会花所有时间针对 Rack 2.0 进行开发,使用 Rack 1.x 中不可用的新 API,只是在使用 production 组时,Bundler 切换到 Rack 1.2。

这在实践中不应该造成任何问题,因为我们不会尝试安装被排除的组中的 gem,并且只在依赖项解析过程中进行评估。

这也意味着您不能在不同的组中包含相同 gem 的不同版本,因为这样做会导致在开发和生产中使用不同的依赖项集。由于依赖项解析过程的复杂性,这通常会影响您在 GemfileGemfile(5)中列出的 gem 以外的更多内容,并且(令人惊讶地)会彻底改变您正在使用的 gem。

Gemfile.lock

当您运行 bundle install 时,Bundler 会将您使用的所有 gem 的完整名称和版本(包括 GemfileGemfile(5)中指定的 gem 的依赖项)持久化到一个名为 Gemfile.lock 的文件中。

Bundler 在所有后续调用 bundle install 时使用此文件,这保证了你始终使用完全相同的代码,即使你的应用程序在机器之间移动。

由于依赖关系解析的工作方式,即使是看似很小的更改(例如,更新你 Gemfile(5) 中 gem 的依赖项的点版本)也会导致需要完全不同的 gem 来满足所有依赖项。

因此,你 应该 将你的 Gemfile.lock 检查到版本控制中,无论是在应用程序还是 gem 中。如果你不这样做,每个检出你的仓库的机器(包括你的生产服务器)都会再次解析所有依赖项,如果 Gemfile(5) 中的任何 gem 或其任何依赖项已更新,这将导致使用不同版本的第三方代码。

当 Bundler 首次发布时,Gemfile.lock 被包含在与生成的 gem 一起提供的 .gitignore 文件中。然而,随着时间的推移,很明显这种做法将破坏依赖项的痛苦强加于新的贡献者,而让现有的贡献者可能没有意识到这个问题。由于 bundle install 通常是贡献的第一步,破坏依赖项的痛苦会阻止新的贡献者做出贡献。因此,我们已经修改了对 gem 作者的指导,现在建议将 gem 的锁定检查进去。

保守更新

当你对 Gemfile(5) 进行更改,然后运行 bundle install 时,Bundler 只会更新你修改的 gem。

换句话说,如果你 没有修改 的 gem 在你调用 bundle install 之前工作,它将继续使用与更新之前完全相同的依赖项版本。

让我们看一个例子。这是你最初的 Gemfile(5)

source 'https://rubygems.org.cn'

gem 'actionpack', '2.3.8'
gem 'activemerchant'

在这种情况下,actionpackactivemerchant 都依赖于 activesupportactionpack gem 依赖于 activesupport 2.3.8rack ~> 1.1.0,而 activemerchant gem 依赖于 activesupport >= 2.3.2braintree >= 2.0.0builder >= 2.0.0

当依赖项首次解析时,Bundler 将选择 activesupport 2.3.8,它满足你 Gemfile(5) 中两个 gem 的要求。

接下来,您需要修改您的 Gemfile(5) 文件。

source 'https://rubygems.org.cn'

gem 'actionpack', '3.0.0.rc'
gem 'activemerchant'

actionpack 3.0.0.rc gem 包含许多新的依赖项,并且将 activesupport 依赖项更新为 = 3.0.0.rc,将 rack 依赖项更新为 ~> 1.2.1

当您运行 bundle install 时,Bundler 会注意到您更改了 actionpack gem,但没有更改 activemerchant gem。它会评估当前正在使用的 gem 以满足其需求。

activesupport 2.3.8
也用于满足 activemerchant 中的依赖项,而 activemerchant 并没有被更新。
rack ~> 1.1.0
当前没有被用于满足其他依赖项。

由于您没有明确要求更新 activemerchant,因此您不会期望它在更新 actionpack 后突然停止工作。但是,满足 actionpack 的新 activesupport 3.0.0.rc 依赖项需要更新其依赖项之一。

即使 activemerchant 声明了一个非常宽松的依赖项,理论上与 activesupport 3.0.0.rc 匹配,Bundler 也会将您 Gemfile(5) 中没有更改的 gem 与其依赖项一起视为一个原子单元。在这种情况下,activemerchant 依赖项被视为 activemerchant 1.7.1 + activesupport 2.3.8,因此 bundle install 将报告它无法更新 actionpack

要明确更新 actionpack,包括其依赖项(其他 Gemfile(5) 中的 gem 仍然依赖于这些依赖项),请运行 bundle update actionpack(参见 bundle update(1))。

总结:一般来说,在对 Gemfile(5) 进行更改后,您应该首先尝试运行 bundle install,这将确保 Gemfile(5) 中的任何其他 gem 不会受到更改的影响。如果这不起作用,请运行 bundle update(1)

另请参阅

在 GitHub 上编辑此文档,如果您发现错误或遗漏内容。