bundler

bundler主要用于管理Ruby应用程序的依赖关系,并按照此依赖关系安装所需的Gems。

安装bundler:

gem install bundler

当运行bundle install命令来安装Gems时,bundler会使用当前目录下的名为Gemfile的文件来处理依赖关系。

Gemfile 是 Bundler 引入的一種檔案,可以在 Gemfile 裡面聲明會用到的 RubyGems。

簡單的 Gemfile

可以在隨意目錄下,使用 bundle init 來建立一個 Gemfile:

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

# gem "rails"

Gem 来源

Gemfile 需要指定一個 Gem 來源站點,Bundler 才知道要去那裡幫你把 RubyGems 抓回來。

source "https://rubygems.org"

使用 http 也可以,https 比較安全。

可以宣告多個來源:

source "https://rubygems.org"
source "https://ruby.taobao.org"

上面的優先。

Gem 撰寫方式

最簡單的便是:

gem "rails"

另可指定版本、require 方式、所屬的 group 等其他選項。

指定 RubyGems 的版本

指定版本的方法與 Rubygems 版本規範相同。舉幾個例子:

gem "nokogiri"
gem "rails", "4.1.1"
gem "rack", "~> 1.5"
gem "kaminari", "~> 0.15.1"
gem "uglifier", ">= 1.3"
gem "sinatra", "~> 1"

這裡看到 4 種版本指定方式:

  1. 不指定版本

      gem "nokogiri"
    

    盡可能使用最新版。

  2. 明確指定版本

       gem "rails", "4.1.1"
    

    指定使用 Rails 4.1.1。

  3. ~>

       gem "rack", "~> 1.5"
    

    會使用介於 1.5 ~ 2.0 的最新版(不包含 2.0)。

     gem "kaminari", "~> 0.15.1"
    

    會使用介於 0.15.1 ~ 0.16.0 的最新版(不包含 0.16.0)

      gem "sinatra", "~> 1"
    

    會使用介於 1.0 ~ 2.0 的最新版(不包含 2.0)

  4. >=

    gem "uglifier", ">= 1.3"
    

    會使用 1.3 以上(包含 1.3)的最新版本。

版本指定方式總結

这些版本号都是语义化版本,可以自己搜索相关概念。

指定方式    起始 ~ 結束(不包含)

">= 3.0"    3.0 ... ∞
"~> 3.0"    3.0 ... 4.0
"~> 3.0.0"    3.0.0 ... 3.1
"~> 3.5"    3.5 ... 4.0
"~> 3.5.0"    3.5.0 ... 3.6
"~> 3"        3.0 ... 4.0

來源:https://github.com/rubygems/rubygems/blob/master/lib/rubygems/version.rb

RubyGems require 方式

一般在有使用 Bundler 的專案裡,會有個檔案,裡面有如下程式碼(以 Rails 為例):

require 'bundler/setup'
Bundler.require(:default, Rails.env)

告訴 Bundler 自動幫你 require RubyGems。

但有些 RubyGem 的名稱不符合 Ruby 的命名,或是不想要 Bundler 自動幫我們 require。

Gem 的名稱不同會有不同的 require 語句,以及類別、模組的命名方式,以下是 Rubygem 的命名慣例:

Gem 名稱 require 語句 主要的類別與模組
fancy_require require "fancy_require" FancyRequire
ruby_parser require "ruby_parser" RubyParser
net-http-persistent require "net/http/persistent" Net::HTTP::Persistent
rdoc-data require "rdoc/data" RDoc::Data
autotest-growl require "autotest/growl" Autotest::Growl
net-http-digest_auth require "net/http/digest_auth" Net::HTTP::DigestAuth

命名慣例有幾點要注意的是:

  • 多個單字使用底線(_)區隔。
  • 為某個 Gem 寫的擴充功能請用橫槓 -,比如 rspec-rails 是 rspec 對 Rails 的擴充。
  • 正確混用底線與橫槓 -,如:net-http-digest_auth。
  • 不要使用全大寫。OSX、Windows 不分大小寫的,很容易出錯。

看一些例子:

gem "recaptcha", :require => "recaptcha/rails"
gem "activeadmin", github: "gregbell/active_admin"

RubyGems 分組管理

使用 :group 選項:

gem "bullet", :group => "development"

多個群組使用 :groups 選項:

gem "factory_girl_rails", :groups => [:development, :test]

指定 RubyGems 來源為 Git

可以指定托管在使用 Git 平台上(如 GitHub、Bitbucket、Gitcafe)的 RubyGem。

使用 :git 選項:

gem "rails", :git => "git://github.com/rails/rails.git"

指定分支

使用 :branch 指定。

gem "rails", :git => "git://github.com/rails/rails.git", branch: "4-1-stable"

GitHub

由於 GitHub 很流行,所以有一個特別的 :github 選項。

gem "rails", github: "rails/rails"

指定 RubyGems 來源為本機路徑

使用 :path 選項:

指定 RubyGems 的平台

根據 Ruby 版本不同,指定不同的 debugger:

gem debugger, platforms: [:ruby_18, :ruby_19]
gem byebug,   platforms: [:ruby_20, :ruby_21]

Gemfile 指定 Ruby

使用 2.1.2:

ruby "2.1.2"

使用 2.0.0-p481:

ruby "2.0.0", patchlevel: "481"

使用 JRuby:

ruby "1.8.7", engine: "jruby", engine_version: "1.6.7"

注意 Ruby 的版本要與 JRuby 的 engine_version 相容。

berkshelf

chef的cookbook管理工具berkshelf,跟bundler的用法几乎雷同了。