本指南最初是为 Bundler v1.12 编写的。如果您使用的是其他版本,请注意输出可能会有所不同。要检查 Bundler 版本,只需运行 bundle -v
。
一些框架内置支持 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 包含 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
的信息 这里.
现在让我们向项目添加一些依赖项
# 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 语法的知识。
要安装用于开发的 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
。
要运行此命令,有一些要求
Gemfile.lock
文件。Gemfile.lock
必须是最新的。要了解更多关于 bundle install
命令的信息,请点击 这里.
Bundler 使用此文件来保存所有 gem 的名称和版本。它保证您始终使用完全相同的代码,即使您的应用程序在机器之间移动。在指定 gem 首次安装后,Bundler 将锁定其版本。要更新它,您必须使用:bundler update
或/以及修改 Gemfile
中的版本。
当您使用 Bundler 的某些命令(例如 bundle install
或 bundle 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_portile2
是 nokogiri
的依赖项,因为它在下面并缩进PLATFORMS
- 应用程序中使用的平台(此处了解更多)。DEPENDENCIES
- 在我们的 Gemfile 中定义的 gem。BUNDLED WITH
- 最后用于更改 Gemfile.lock
的 Bundler 版本让我们先看一些例子
$ bundle exec rspec
$ bundle exec rails s
这将允许您在当前的 bundle 上下文中运行命令(此处为 rspec
和 rails s
),使 Gemfile 中的所有 gem 都可用于 require
和使用。
要了解有关 bundle exec
命令的更多信息,请单击 此处。
现在让我们更新一些 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 管理的应用程序时,您应该使用以下工作流程
$ bundle init
Gemfile
后,请运行$ bundle install
Gemfile.lock
检入版本控制$ git add Gemfile.lock
$ bundle install
$ bundle install --deployment
Gemfile
以反映新的或更新的依赖项后,请运行$ bundle install
$ git add Gemfile.lock
bundle install
报告冲突,请手动更新您在 Gemfile
中更改的特定 gem$ bundle update rails thin
$ bundle update
git bisect
参见 Git Bisect 指南。