Docs header transparent bg

如何升级到 Bundler 2

所以!您已经听说过Bundler 2 发布了!如果您想亲自尝试 Bundler 2,本指南将帮助您做到这一点。

Bundler 2 与之前的版本 1.17 几乎完全相同。最大的变化是 Bundler 现在需要至少 Ruby 2.3.0 和 RubyGems 2.5.0。

先决条件

在升级到 Bundler 2 之前,请确保您拥有正确的 Ruby 和 RubyGems。您需要使用 Ruby 2.3.0 或更高版本,并且需要安装 RubyGems 2.5.0 或更高版本。

您可以通过运行 ruby --version 检查您的 Ruby 版本,并通过运行 gem --version 检查您的 RubyGems 版本。如果您需要升级 Ruby,请使用您的 Ruby 版本管理器的说明。如果您需要升级 RubyGems,请运行 gem update --system

都准备好了吗?Ruby 和 RubyGems 版本足够新吗?很好。继续。

安装 Bundler 2

升级到 Bundler 2 的第一步是安装 Bundler 2 gem。要以通常的方式安装它,请运行 gem install bundler,RubyGems 将安装最新版本的 Bundler。

版本自动切换

现在您已经安装了 Bundler 2,您应该知道 Bundler 会根据您的应用程序的 Gemfile.lock 自动在版本 1 和版本 2 之间切换。如果您的 lockfile 是由 Bundler 1 创建的,您的命令将由 Bundler 1 运行。如果您的 lockfile 是由 Bundler 2 创建的,您的命令将由 Bundler 2 运行。

以下是一个由 Bundler 1.17.1 创建的 Gemfile.lock 示例。

GEM
  remote: http://rubygems.org.cn/
  specs:
    rack (2.2.4)

PLATFORMS
  ruby

DEPENDENCIES
  rack

BUNDLED WITH
   1.17.1

BUNDLED WITH 部分中的 Bundler 版本由 Bundler 读取,以确定应该运行哪个版本的 Bundler。使用上面的示例 lock,Bundler 1 将被使用,如您在此处所见

$ grep -A 1 "BUNDLED WITH" Gemfile.lock
BUNDLED WITH
   1.17.1

$ bundle version
Bundler version 1.17.1

当 Gemfile 由 Bundler 2 创建,或由开发人员从 Bundler 1 手动升级到 Bundler 2 时,命令将由最新安装的 Bundler 2 运行。以下是一个示例,说明了它的样子

$ grep -A 1 "BUNDLED WITH" Gemfile.lock
BUNDLED WITH
   2.0.0

$ bundle version
Bundler version 2.0.0

当 Bundler 在应用程序之外使用时,将始终使用最新安装的版本。

$ ls -a
.	..

$ bundle version
Bundler version 2.0.0

将应用程序从 Bundler 1 升级到 Bundler 2

您现有的应用程序将继续使用 Bundler 1。Bundler 永远不会将您的应用程序更改为新的主要版本,直到您选择这样做为止。如果您的应用程序已准备就绪,您可以通过运行 bundle update --bundler 将该应用程序升级到最新安装的 Bundler 版本。

我们建议您在升级之前提交您的 Gemfile.lock。这样,如果出现问题或无法正常工作,您始终可以恢复到之前的 lockfile 并返回使用 Bundler 1。

在新的应用程序中使用 Bundler 2

当您使用 bundle initrails new 或类似命令创建新应用程序时,您的应用程序将使用当前安装的最新版本的 Bundler。如果您安装了 Bundler 2,您的应用程序将锁定到 Bundler 2。您可以通过阅读 lockfile 并查找名为 BUNDLED WITH 的部分来验证这一点。

常见问题解答

为什么 Bundler 有自动版本切换功能?

许多 Ruby 开发人员在他们的机器上拥有多个应用程序。如果我们强制一台机器上的所有应用程序都只使用 Bundler 1 或 Bundler 2,这将给每个人带来巨大的痛苦。

版本切换允许每个人在同一台机器上同时使用 Bundler 1 和 Bundler 2,而其他应用程序可以使用 Bundler 2。每个应用程序都可以升级到 Bundler 2,只要对该特定应用程序进行升级是最有意义的。

如果我的应用程序需要 Bundler 2,但我只安装了 Bundler 1 会发生什么?

如果您尝试在需要 Bundler 2 的应用程序上使用 Bundler 1,您将看到一条错误消息,说明您需要安装 Bundler 2。继续运行 gem install bundler,然后它应该可以工作。

如果我的应用程序需要 Bundler 1,但我只安装了 Bundler 2 会发生什么?

如果您尝试在需要 Bundler 1 的应用程序上使用 Bundler 2,并且您根本没有安装 Bundler 1,您将看到一条错误消息,要求您安装 Bundler 1。继续运行 gem install bundler -v "~>1.0" 来安装最新版本的 Bundler 1.x,然后再次尝试您的命令。

我可以将我的应用程序从 Bundler 2 降级到 Bundler 1 吗?

Bundler 2 不提供将 Gemfile 降级回 Bundler 1 的方法。相反,我们建议您在升级应用程序之前检查您的 GemfileGemfile.lock。这样,如果出现问题,您可以恢复到之前的提交并返回使用 Bundler 1。

升级我的应用程序到 Bundler 2 时出现问题

哦,不!对此表示歉意。请访问我们的 故障排除指南 并创建一个工单,以便我们尽快尝试解决您的问题。

Bundler 2 会有其他值得注意的更改吗?

Bundler 2 包含以下更改

  • 删除对已弃用 Ruby 版本(< 2.3)的支持
  • 删除对已弃用 RubyGems 版本(< 2.5.0)的支持
  • 将 Bundler 错误打印到 STDERR 而不是 STDOUT
  • Gemfile 中的 github: 快捷方式将使用 https 而不是 http

我可以在 Heroku 上使用 Bundler 2 吗?

可以!Heroku 团队已将官方 Ruby 构建包升级到 支持 Bundler 2。有关更多详细信息,请参阅 Heroku 关于 Bundler 版本的文章

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