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 種版本指定方式:
不指定版本
gem "nokogiri"
盡可能使用最新版。
明確指定版本
gem "rails", "4.1.1"
指定使用 Rails 4.1.1。
~>
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)
>=
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的用法几乎雷同了。