Gemfile 介紹

Juanito FatasThinking about what to do.

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-railsrspec 對 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 相容。