Gemfile 是 Bundler 引入的一種檔案,可以在 Gemfile 裡面聲明專案會用到的 RubyGems。
可以在隨意目錄下,使用 bundle init
來建立一個 Gemfile:
# A sample Gemfile
source "https://rubygems.org"
# gem "rails"
Gemfile 需要指定一個 Gem 來源站點,Bundler 才知道要去那裡幫你把 RubyGems 抓回來。
source "https://rubygems.org"
使用 http 也可以,https 比較安全。
可以宣告多個來源:
source "https://rubygems.org"
source "https://ruby.taobao.org"
上面的優先。
最簡單的便是:
gem "rails"
另可指定版本、require
方式、所屬的 group 等其他選項。
指定版本的方法與 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
一般在有使用 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"
使用 :group
選項:
gem "bullet", :group => "development"
多個群組使用 :groups
選項:
gem "factory_girl_rails", :groups => [:development, :test]
可以指定托管在使用 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
選項。
gem "rails", github: "rails/rails"
使用 :path
選項:
根據 Ruby 版本不同,指定不同的 debugger:
gem "debugger", platforms: [:ruby_18, :ruby_19]
gem "byebug", platforms: [:ruby_20, :ruby_21]
使用 <= 2.6.0 < 2.7
:
ruby "~> 2.6.0"
使用 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
相容。