Rails3:使用bundler管理gems

bundler是一套为了 Rails3 所打造的全新 Gem dependencies 管理工具:一套基于 Rubygems 的更高阶套件管理工具,适合让 Application 管理多套 Gems 依存关係的複杂情境。而你在 Rails3 中 (Bundler 不只用在 Rails3,其他例如 Sinatra 或是 Rails2 也都可以使用) 要使用的 Gems,也都必须宣告在它的 Gemfile 裡,没写在裡面的话,就算手动 require 也找不到。这跟已往你可以直接 require 任意 rubygems 不同,在使用 Bundler 的环境中,要 require 什麽 rubygems 必须透过 Gemfile 管理。

Gemfile 的寫法大致如下:
# 第二个参数可以指定版本
gem "rails", "3.0.0.beta3"

# 如果 require 的档名不同,可以加上 :require
gem "sqlite3-ruby", :require=> "sqlite3"

# 可以用 Git 当做来源,甚至可以指定 branch, tag 或 ref。
gem 'authlogic', :git=> 'git://github.com/odorcicd/authlogic.git',
                           :branch=> 'rails3'

# 可以直接用电脑裡的其他目录
gem "rails", :path=> '/Users/ihower/github/rails'

# Group 功能可以让特定环境才会载入
group :testdo
   gem "rspec-rails", ">= 2.0.0.beta.8"
   gem "webrat"
end

设定好 Gemfile 之后,我们有一些指令可以用:
bundle check 可以检查目前缺少哪些 rubygem,然后你可以手动透过 sudo gem install 安装到系统裡。 bundle install 安装所有需要的套件。如果系统已经有装了,就用系统的,不然会装到 $BUNDLE_PATH 下,预设是你家目录 ~/.bundle (因此请不要用 sudo 执行 bundle install)。如果来源是 git (例如上述的 authlogic),每次执行 bundle install 就会自动 git pull 更新,十分方便。 bundle lock 和 bundle unlock 会做 snapshotting 记录下目前所有套件的版本在 Gemfile.lock,建议这个档桉也一起 commit 出去。适合要佈署或多人开发时,可以确保大家的版本都一致。 bundle package 如果你的 Server 没联外网路,或是怕 rubygems.org 连不上,可以用这个指令把所有套件都打包到 vendor/cache 下。基本上,跟以往 Rails 1.X 2.X 时代佈署时会建议你尽量打包依存套件并 commit 出去,在使用 Bundler 后已经大大地不需要了,因为透过 bundle lock 我们就可以确保每台机器上执行的套件版本一致。 bundle exec 因为 Bundle 可以说是独立出一个套件环境,所以如果有非 Rails 的指令需要执行,而且你的系统 Gems 又没有安装,那就会需要透过 bundle exec XXX 来执行。例如 bundle exec cucumber。 bundle show gem_name 可以查看这个 gem 的目录位置 bundle open gem_name 可以用编辑器打开这个 gem 的目录

开发 Rails3 实际用一阵子之后,发现很偏好将套件装成 Gem 了(如果有提供 Gem 版的话),之前 Rails 1.X 2.X 时代会比较喜欢装成 Plugin,因为想说别人要装 Gem 可能会有问题,以及佈署也怕出包。但是有了 Bundler 之后,只要 Bundle install 就可以装好并确保大家的版本一致会动。不像已往的 rake gems:install 超不可靠。可以透过 Bundle 装这些依存套件也减少了需要 commit 出去的 vendor/plugin 档桉,让你的专桉 repository 变乾淨了。另外,我也超喜欢的 Bundler 可以支援 Git 来源,只要 bundle install 就会更新,不需要额外的管理工具去烦恼更新 plugins。

其他推荐阅读:
Library Management Gets an Update in Rails 3: 一般性介紹ASCIIcasts 201: Bundler: 一般性介紹Using the New Gem Bundler Today: 有 Bundler 的設計目標,推薦看第一段即可。Using Bundler in Real Life: Bundle 的使用情境介紹,非常推薦一看Some of the Problems Bundler Solves: 深入舉例 Bundler 要解決的問題,為什麼單靠 Rubygems 和之前的 config.gem 做不到。有時間的話,也推薦一看。例如,其中最主要解決的問題是,目前的 Rubygems 同一時間只能 require 一個版本,所以如果你有兩個套件有不同版本的需求,例如一個套件指定需要 rspec 1.1.12,另一個指定需要 1.2.0。那就爆炸了,會出現 can’t activate rspec(= 1.1.12 runtime), already activated rspec-1.2.0 的錯誤。Named Gem Environments and Bundler: 深入解釋了 Bundler 如何處理 dependency 問題The How and Why of Bundler Groups: 深入解釋 Group 功能Yuhada 在 RubyConf 2009 的演講:Polishing Rubygems

转至:http://ihower.tw/blog/archives/4464


你可能感兴趣的:(git,Rails,rubygems,rspec,Sinatra)