Bundler Manual

这篇文章是10年11月发表于JavaEye 做下更新然后同步到个人blog中。

http://bundler.io/

Bundler manages an application’s dependencies through its entire life across many machines systematically and repeatably.

Rails 3 中引入Bundle来管理项目中所有gem依赖,该命令只能在一个含有Gemfile的目录下执行,如rails 3项目的根目录。

###关于Gemfile 和 Gemfile.lock

所有project的信赖包都在Gemfile中进行配置,不再像以往那样,通过require来查找。Rails 3中如果需要 require 某个 gem 必须通过 Gemfile 来管理。

Gemfile.lock 则用来记录本机目前所有依赖的 RubyGems 和其版本,所以强烈建议将该文件放入版本控制器,从而保证大家基于同一环境下工作。

###依赖项检测

显示所有的依赖包

1
$ bundle show

显示某个Gem包的安装位置

1
$ bundle show [gemname]

可以檢查目前缺少哪些 rubygem

1
$ bundle check

不缺的话则会输出:The Gemfile’s dependencies are satisfied

###Gem安装与更新

http://bundler.io/bundle_install.html

如何安装所缺少的RubyGem呢?

1
2
3
$ bundle
$ bundle install
$ bundle install [gemname]

####Group

Grouping your dependencies allows you to perform operations on the entire group.

http://bundler.io/groups.html

####Path

Specify a different path than the system default ($BUNDLE_PATH or $GEM_HOME). Bundler will remember this value for future installs on this machine

你可以手动指定一个安装路径,bundle会默认的将需要的gem安装到该目录下,而不是系统指定的目录。这个配置会被记录在配置文件中。见下面。

####Config

如果在使用bundle install时,使用了参数,这些参数会被记录在.bundle/config文件中,示例如下:

1
2
3
4
5
6
---
BUNDLE_FROZEN: '1'
BUNDLE_PATH: "/home/lanvige/apps/myapp/shared/bundle"
BUNDLE_BIN: "/home/lanvige/apps/myapp/shared/bin"
BUNDLE_WITHOUT: development:test
BUNDLE_DISABLE_SHARED_GEMS: '1'
1
2
$ bundle install development
$ bundle install --without test development

Update

如果gems有新版本,Gemfile.lock如何同步更新

1
2
$ bundle update
$ bundle update [gemname]

这样bundle会去检查 http://rubygems.org/ 上 gem的最新版本,如果本地旧的话,会去更新到最近版本。然后同步更新Gemfile.lock

在Linux下不要使用 sudo bundle install/update,这样会在.bundle目录下查找bundle install path 的配置,找到后安装到该目录,而非系统指定的目录,不方便管理。

http://gembundler.com/man/bundle-install.1.html

Clean

随着项目不断升级,会有很多旧版本的Gem存在,而这些Gem会占用大量的空间,需要及时清理,对于系统的清理,直接使用gem cleanup即可,但如果bundle 指定了path后,只能通过bundle的命令来进行清理了,上面有提起过bundle会将install时所指定的配置存储起来,所以当执行bundle命令时,它很聪明的找到了之前的安装位置。

1
$ bundle clean

###项目中加入新的Gem

如何向项目中添加新的Gem引用?
Add the gem to Gemfile. just like below:

1
2
3
4
5
6
7
8
9
10
gem 'rails', '3.0.1'
gem 'sqlite3-ruby', :require => 'sqlite3'
gem "haml"
gem "nokogiri", :git =>"git://github.com/tenderlove/nokogiri.git"
gem "customer", :path => '/Users/lanvige/repos/customer'
gem "wirble", :group => :development
group :test do
gem "rspec"
gem "faker"
end

######支持Git

使用 :git 来添加一个来自于github的gem。

######File

使用:path 指向到一个符合rubygem规范的目录。

######Version

在gem后声明版本来强制项目中使用该Gem的版本

###环境锁定/解锁

####锁定当前环境

使用bundle lock来锁定当前开发环境,这样,便不能通过bundle update来更改本地包的版本,使开发保持在一个稳定的环境中

1
$ bundle lock

通过unlock来解除锁定:

1
$ bundle unlock

打包当装环境,会把当前所有信赖的包都放到 ./vendor/cache/ 目录下,发布时可用来保证包版本的一致性。

1
$ bundle package

###Gem & Plugin的选择

在Rails 2中,开发人员会更便向使用plugin,因为安装、更新的布署都会经常遇到问题,但在 Rails3 中引入了bundle之后,更多的人喜欢使用gem的方式来管理引用。

这样你的本地代码库会很干净,便于理解。也不需要将这些库放到版本控制器中,减少空间 ;)

###REF::

GemBundler http://bundler.io/
Understanding Bundler: http://gembundler.com/rationale.html
Gemfile Manual: http://gembundler.com/man/gemfile.5.html
CLI Manual: http://gembundler.com/man/bundle.1.html