Update(2011): Bundler Pro Tips
Update(2010/7/27): Bundle 1.0.0 之後不需要 bundle lock 了,只要 bundle install 就會自動 lock。預設都裝到 system gem 的位置。
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 :test do
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 出去。適合要佈署或多人開發時,可以確保大家的版本都一致。不用手動lock了,bundle install 時就會產生 Gemfile.lock- 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
發佈留言