# 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"
~~~
盡可能使用最新版。
1.
明確指定版本
~~~
gem "rails", "4.1.1"
~~~
指定使用 Rails 4.1.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)
1.
>=
~~~
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](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的用法几乎雷同了。
- 序
- Chapter 1: 初识Chef
- 一些背景
- Chef vs Puppet
- Chapter 2: Chef应用
- Chef架构
- Chef能做什么
- Chef组件
- Chef环境安装
- chef-server
- opscode-chef
- chef-solo
- Chef实战
- 实战前的必修理论
- 使用Chef
- Chapter 3: Ruby基础
- 对象与方法
- 标识符
- 类与模块
- 数据类型
- 真与假
- 控制语句
- 代码块
- Chapter 4: Chef源码架构
- Rubygems与gem
- bundler
- Chef源码组织
- Chapter 5: Rails基础
- Rails是什么
- MVC架构
- Restful
- Rails组成与项目结构
- Chapter 6: Chef Server WebUI
- Chef Server Webui组织结构
- Chef Rest API
- 参考