Docs header transparent bg

如何使用 Bundler 管理应用程序依赖项

本指南最初是为 Bundler v1.12 编写的。如果您使用的是其他版本,请注意输出可能会有所不同。要检查 Bundler 版本,只需运行 bundle -v

内容

  1. 入门 - 安装 Bundler 和 bundle init
  2. 编辑 Gemfile
    1. 添加 Gem
    2. Gemfile 语法
  3. 安装 Gem - bundle install
    1. 开发
    2. 部署
  4. Gemfile.lock
  5. 执行命令 - bundle exec
  6. 更新 Gem - bundle outdatedbundle update
  7. 推荐工作流程
  8. 故障排除
    1. 在使用 Bundler 的项目中运行 git bisect

入门 - 安装 Bundler 和 bundle init

一些框架内置支持 Bundler,例如,当您运行 rails new app 时,它会自动初始化 Bundler。

首先,我们需要安装 Bundler。

$ gem install bundler

此命令还会更新已安装的 bundler。您应该得到类似的输出

$ gem install bundler
Successfully installed bundler-1.12.5
1 gem installed

要手动初始化 Bundler,请执行以下操作(bundler_example 将是包含我们应用程序的文件夹)

$ mkdir bundler_example && cd bundler_example
$ bundle init

这将在 bundler_example 文件夹中创建 Gemfile

# frozen_string_literal: true
# A sample Gemfile
source "https://rubygems.org.cn"

# gem "rails"

编辑 Gemfile

自动生成的 Gemfile 包含 source "https://rubygems.org.cn"。这意味着 Bundler 将在 https://rubygems.org.cn 中搜索 gem。如果您想使用自己的 RubyGems 服务器或其他服务器,只需更改它即可

source "https://your_ruby_gem_server.url"

如果您有多个 gem 源,可以使用块或 :source

source "https://your_ruby_gem_server.url" do
  # gems
end

gem "my_gem", source: "https://your_2_ruby_gem_server.url"

块内的 gem 将从给定源获取。


了解更多关于 source 的信息 这里.

添加 Gem

现在让我们向项目添加一些依赖项

# frozen_string_literal: true
# A sample Gemfile
source "https://rubygems.org.cn"

gem "rails"

使用上面的 Gemfile,bundler install 将安装最新版本的 rails gem。


当我们想要安装指定版本时该怎么办?只需在逗号后指定它即可

gem "rails", "3.0.0"

或使用此语法

gem "rails", "~> 4.0.0" # which is same as gem "rails", ">= 4.0.0", "< 4.1.0" 
gem "nokogiri", ">= 1.4.2"

了解更多关于 Gemfile 中 gem 的信息 这里.

Gemfile 语法

gemfile 手册页 了解更多关于 Gemfile 语法的知识。

安装 Gem - bundle install

开发

要安装用于开发的 gem,只需运行 bundle install

这应该会给你类似的输出

Fetching gem metadata from https://rubygems.org.cn/
Fetching version metadata from https://rubygems.org.cn/
Fetching dependency metadata from https://rubygems.org.cn/
Resolving dependencies...
Using mini_portile2 2.1.0
Using pkg-config 1.1.7
Using bundler 1.12.5
Using nokogiri 1.6.8
Bundle complete! 1 Gemfile dependency, 4 gems now installed.
Use `bundle show [gemname]` to see where a bundled gem is installed.

它还应该创建 Gemfile.lock 文件

GEM
  remote: https://rubygems.org.cn/
  specs:
    mini_portile2 (2.1.0)
    nokogiri (1.6.8)
      mini_portile2 (~> 2.1.0)
      pkg-config (~> 1.1.7)
    pkg-config (1.1.7)

PLATFORMS
  ruby

DEPENDENCIES
  nokogiri (>= 1.4.0)

BUNDLED WITH
   1.12.5

此 Gemfile.lock 在 下一章 中有描述。

部署

对于部署,您应该使用 --deployment 选项

$ bundle install --deployment

这将安装所有依赖项到 ./vendor/bundle

要运行此命令,有一些要求

  1. 需要 Gemfile.lock 文件。
  2. Gemfile.lock 必须是最新的。

要了解更多关于 bundle install 命令的信息,请点击 这里.

Gemfile.lock

Bundler 使用此文件来保存所有 gem 的名称和版本。它保证您始终使用完全相同的代码,即使您的应用程序在机器之间移动。在指定 gem 首次安装后,Bundler 将锁定其版本。要更新它,您必须使用:bundler update 或/以及修改 Gemfile 中的版本。

当您使用 Bundler 的某些命令(例如 bundle installbundle update)时,此文件会自动创建/更新,您应该将其检入版本控制。

我们将使用上一章的 Gemfile.lock 作为示例。

GEM
  remote: https://rubygems.org.cn/
  specs:
    mini_portile2 (2.1.0)
    nokogiri (1.6.8)
      mini_portile2 (~> 2.1.0)
      pkg-config (~> 1.1.7)
    pkg-config (1.1.7)

PLATFORMS
  ruby

DEPENDENCIES
  nokogiri (>= 1.4.0)

BUNDLED WITH
   1.12.5

让我们分解一下

  • GEM
    • remote - gem 的来源
    • specs - 已安装的 gem(带版本)。我们可以看到 mini_portile2nokogiri 的依赖项,因为它在下面并缩进
  • PLATFORMS - 应用程序中使用的平台(此处了解更多)。
  • DEPENDENCIES - 在我们的 Gemfile 中定义的 gem。
  • BUNDLED WITH - 最后用于更改 Gemfile.lock 的 Bundler 版本

执行命令 - bundle exec

让我们先看一些例子

$ bundle exec rspec

$ bundle exec rails s

这将允许您在当前的 bundle 上下文中运行命令(此处为 rspecrails s),使 Gemfile 中的所有 gem 都可用于 require 和使用。


要了解有关 bundle exec 命令的更多信息,请单击 此处

更新 Gem - bundle outdatedbundle update

现在让我们更新一些 gem。使用 bundle outdated,我们可以列出已安装的 gem,这些 gem 有更新的版本可用

$ bundle outdated
Fetching gem metadata from https://rubygems.org.cn/
Fetching version metadata from https://rubygems.org.cn/
Fetching dependency metadata from https://rubygems.org.cn/
Resolving dependencies.......

Outdated gems included in the bundle:
  * nokogiri (newest 1.6.8, installed 1.6.7.2) in group "default"

您也可以指定 gem(bundle outdated *gems)。

我们已将 nokogiri 锁定在 1.6.7.2 版本上。我们如何更新它?bundle install 不会安装更新的版本,因为它在 Gemfile.lock 文件中被锁定。我们必须使用 bundle update

$ bundle update
Fetching git://github.com/middleman/middleman-syntax.git
Fetching gem metadata from https://rubygems.org.cn/
Fetching version metadata from https://rubygems.org.cn/
Fetching dependency metadata from https://rubygems.org.cn/
Resolving dependencies.....
Installing nokogiri 1.6.8 (was 1.6.7.2) with native extensions
Using i18n 0.7.0

... (and more)

Bundle updated!

使用 bundle update 而不带任何参数将尝试将每个 gem 更新到最新可用的版本(受 Gemfile 限制)。

要更新特定 gem,请使用 bundle update *gems


要了解有关 bundle outdated 命令的更多信息,请单击 此处

要了解有关 bundle update 命令的更多信息,请单击 此处

一般来说,在使用 Bundler 管理的应用程序时,您应该使用以下工作流程

  • 要初始化 Bundler,请运行
$ bundle init
  • 首次创建 Gemfile 后,请运行
$ bundle install
  • 将生成的 Gemfile.lock 检入版本控制
$ git add Gemfile.lock
  • 在另一台开发机器上检出此存储库时,请运行
$ bundle install
  • 在部署机器上检出此存储库时,请运行
$ bundle install --deployment
  • 更改 Gemfile 以反映新的或更新的依赖项后,请运行
$ bundle install
  • 确保将更新的 Gemfile.lock 检入版本控制
$ git add Gemfile.lock
  • 如果 bundle install 报告冲突,请手动更新您在 Gemfile 中更改的特定 gem
$ bundle update rails thin
  • 如果您想将所有 gem 更新到与 Gemfile(5) 中列出的 gem 匹配的最新版本,请运行
$ bundle update

故障排除

在使用 Bundler 的项目中运行 git bisect

参见 Git Bisect 指南

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