Docs header transparent bg

深入探討

閱讀手冊,深入探討 Gemfile 中所有可用選項及其使用方法。

Gemfile 手冊

Gemfiles

Gemfiles 至少需要一個寶石來源,以 RubyGems 伺服器的 URL 形式呈現。執行 bundle init,使用預設的 rubygems.org 來源產生 Gemfile。如果可以,請使用 https,這樣您與 rubygems.org 伺服器的連線將透過 SSL 驗證。

source 'https://rubygems.org'

# Gems here

如果您想從其他來源取得寶石,請務必將額外來源包在區塊中。多個全域來源行有安全風險,不應使用,因為它們可能導致從非預期來源安裝寶石。

source 'https://rubygems.org'

# Gems here

source 'https://gems.example.com' do
  # Gems from the alternative source here
end

有些寶石來源需要使用者名稱和密碼。使用 bundle config 設定需要任何來源的使用者名稱和密碼。必須在每個將安裝 Gemfile 的電腦上執行一次此命令,但這可避免憑證以純文字儲存在版本控制中。

$ bundle config https://gems.example.com/ user:password

對於某些來源,例如公司 Gemfury 帳戶,將憑證包含在 Gemfile 中作為來源 URL 的一部分可能更容易。

source "https://user:password@gems.example.com"

來源 URL 中的憑證將優先於使用 config 設定的憑證。宣告您需要的寶石,包括版本號碼。使用 RubyGems 支援的相同語法指定版本。

gem 'nokogiri'
gem 'rails', '5.0.0'
gem 'rack',  '>=1.0'
gem 'thin',  '~>1.1'

大多數版本規範符,例如 >= 1.0,不言自明。規範符 ~> 有特殊的意義,最好的方式是透過範例說明。~> 2.0.3>= 2.0.3< 2.1 相同。~> 2.1>= 2.1< 3.0 相同。~> 2.2.beta 將符合預發布版本,例如 2.2.beta.12~> 0>= 0.0< 1.0 相同。

RubyGems 版本規範符

如果寶石的主檔案與寶石名稱不同,請指定如何需要它。

gem 'rack-cache', :require => 'rack/cache'
gem 'sqlite3'

指定 :require => false 以防止 bundler 需要寶石,但仍安裝它並維護相依性。

gem 'rspec', :require => false
gem 'sqlite3'

若要在 Gemfile 中載入 gem,您需要在應用程式中呼叫 Bundler.require

深入了解:Bundler.require

如果某些 gem 需要從私人 gem 伺服器擷取,則可為這些 gem 覆寫此預設來源。對於只包含單一 gem 的 gem 伺服器,最簡單的方法是在該 gem 上使用 :source 選項。

gem 'my_gem', '1.0', :source => 'https://gems.example.com'

如果多個 gem 來自同一個伺服器,您可以使用 source 區塊將它們分組在一起。

source 'https://gems.example.com' do
  gem 'my_gem', '1.0'
  gem 'another_gem', '1.2.1'
end

如上所述,gem 伺服器的憑證可以在 URL 中指定,或使用 bundle config 指定。只要儲存庫包含一個或多個有效的 gem,Git 儲存庫也是有效的 gem 來源。使用 :tag:branch:ref 指定要簽出的內容。預設為 master 分支。

gem 'nokogiri', :git => 'https://github.com/tenderlove/nokogiri.git', :branch => '1.4'

如果 Git 儲存庫不包含 .gemspec 檔案,bundler 會建立一個簡單的檔案,不包含任何相依性、可執行檔或 C 延伸模組。這可能適用於簡單的 gem,但可能不適用於其他 gem。如果沒有 .gemspec,您可能不應該從 Git 使用 gem。

深入了解:Git

如果您想直接從檔案系統使用未封裝的 gem,只需將 :path 選項設定為包含 gem 檔案的路徑即可。

gem 'extracted_library', :path => './vendor/extracted_library'

如果您想直接從檔案系統使用多個本機 gem,您可以將全域 path 選項設定為包含 gem 檔案的路徑。這將自動從子目錄載入 gemspec 檔案。

path 'components' do
  gem 'admin_ui'
  gem 'public_ui'
end

相依性可以放入群組中。群組可以在安裝時略過(使用 --without),或一次全部載入(使用 Bundler.require)。

gem 'wirble', :group => :development
gem 'debugger', :group => [:development, :test]

group :test do
  gem 'rspec'
end

深入了解:群組

您可以在 Gemfile 中使用 ruby 指定 Ruby 的必要版本。如果在不同的 Ruby 版本上載入 Gemfile,Bundler 會引發一個包含說明的例外狀況。

ruby '1.9.3'

這表示此應用程式相依於與 1.9.3 相容的 ABI 的 Ruby VM。如果版本檢查不符,Bundler 會引發例外。這將確保執行中的程式碼相符。您可以使用 :engine:engine_version 選項更具體。

ruby '1.9.3', :engine => 'jruby', :engine_version => '1.6.7'

深入了解:Ruby 指令

在 GitHub 上編輯此文件,如果您發現錯誤或遺漏之處。