Docs header transparent bg

如何從 git 儲存庫安裝寶石

本文件適用於 Bundler 2.1 或更高版本。如果您仍在使用已棄用的 Bundler 2.0 或更早版本,請使用 bundle config X Y,而非 bundle config set X Y

Bundler 能夠直接從 git 儲存庫安裝寶石。使用 git 安裝寶石就像將寶石新增到 Gemfile 一樣容易。

請注意,由於 RubyGems 沒有處理 git 寶石的能力,因此任何從 git 儲存庫安裝的寶石都不會顯示在 gem list 中。但是,在執行 Bundler.setup 之後,它們將會可用。

指定寶石應來自根目錄有 .gemspec 的 git 儲存庫

gem 'rack', git: 'https://github.com/rack/rack'

如果 git 儲存庫的根目錄沒有 .gemspec,您必須指定 bundler 在解析依賴項時應使用的版本

gem 'nokogiri', '1.7.0.1', git: 'https://github.com/sparklemotion/nokogiri'

如果寶石位於 git 儲存庫的子目錄中,您可以使用 :glob 選項指定其 .gemspec 的位置

gem 'cf-copilot', git: 'https://github.com/cloudfoundry/copilot', glob: 'sdk/ruby/*.gemspec'

指定包含多個 .gemspec 檔案的 git 儲存庫應視為寶石來源

git 'https://github.com/rails/rails.git' do
  gem 'railties'
  gem 'actionpack'
  gem 'activemodel'
end

從前一個範例,您可以指定特定參照、分支或標籤

git 'https://github.com/rails/rails.git', ref: '4aded' do
git 'https://github.com/rails/rails.git', branch: '5-0-stable' do
git 'https://github.com/rails/rails.git', tag: 'v5.0.0' do

為內嵌指定的 git 儲存庫指定參照、分支或標籤,其運作方式完全相同

gem 'nokogiri', git: 'https://github.com/sparklemotion/nokogiri.git', ref: '0bd839d'
gem 'nokogiri', git: 'https://github.com/sparklemotion/nokogiri.git', tag: '2.0.1'
gem 'nokogiri', git: 'https://github.com/sparklemotion/nokogiri.git', branch: 'rack-1.5'

Bundler 可以使用 HTTP(S)、SSH 或 git

gem 'rack', git: 'https://github.com/rack/rack.git'
gem 'rack', git: 'git@github.com:rack/rack.git'
gem 'rack', git: 'git://github.com/rack/rack.git'

指定 bundler 也應展開 git 儲存庫的子模組

gem 'rugged', git: 'git://github.com/libgit2/rugged.git', submodules: true

如果您從公開的 GitHub 儲存庫取得寶石,您可以使用簡寫

gem 'rack', github: 'rack/rack'

如果儲存庫名稱與託管它的 GitHub 帳戶相同,您可以省略它

gem 'rails', github: 'rails'

注意:此簡寫只能用於 Bundler 版本 1.x 中的公開儲存庫。對於讀寫,請使用 HTTPS

gem 'rails', git: 'https://github.com/rails/rails'

所有常見的 :git 選項都適用,例如 :branch:ref

gem 'rails', github: 'rails', ref: 'a9752dcfd15bcddfe7b6f7126f3a6e0ba5927c56'

對於 Bitbucket (:bitbucket) 和 GitHub Gists (:gist) 有類似的捷徑。

gem 'keystone', bitbucket: 'musicone/keystone'
gem 'my_gist', gist: '4815162342'

自訂 git 來源

上面使用的 :github 捷徑是 Bundler 內建的 git 來源之一。Bundler 附帶 :github:gist:bitbucket 的捷徑,但您也可以新增自己的捷徑。

如果您使用 Github Enterprise、Stash,或只是有自訂 git 設定,請在使用您的自訂選項之前,透過呼叫 git_source 來建立自己的捷徑。以下是 Stash 的範例

git_source(:stash){ |repo_name| "https://stash.corp.acme.pl/#{repo_name}.git" }
gem 'rails', stash: 'forks/rails'

安全性

http://git:// URL 不安全。中間人攻擊者可以在您檢出時竄改程式碼,並可能提供惡意程式碼,而非您打算檢出的程式碼。由於 :github 捷徑在 Bundler 1.x 版本中使用 git:// URL,我們建議使用 HTTPS URL 或使用您自己的 HTTPS git 來源覆寫 :github 捷徑。

本機 Git 儲存庫

Bundler 也允許您在本地處理 git 儲存庫,而不使用遠端版本。這可透過設定本地覆寫來達成

$ bundle config set local.GEM_NAME /path/to/local/git/repository

例如,為了使用本地的 Rack 儲存庫,開發人員可以呼叫

$ bundle config set local.rack ~/Work/git/rack

並設定指向分支的 git 儲存庫

gem 'rack', github: 'rack/rack', branch: 'master'

現在,將使用本地覆寫,而不是簽出遠端 git 儲存庫。與路徑來源類似,每次本地 git 儲存庫變更時,Bundler 都會自動擷取變更。這表示本地 git 儲存庫中的提交會將 Gemfile.lock 中的版本更新為本地 git 儲存庫版本。這需要與 git 子模組相同的注意。在推送到遠端之前,您需要確保已推送本地覆寫,否則您可能會指向僅存在於您本地電腦中的提交。

請注意!Bundler 會執行許多檢查,以確保開發人員不會使用無效的參考。特別是,我們強制開發人員在 Gemfile 中指定分支,才能使用此功能。如果 Gemfile 中指定的分支與本地 git 儲存庫中的目前分支不符,Bundler 會中止。這可確保開發人員始終針對正確的分支工作,並防止意外鎖定到不同的分支。

最後,Bundler 也會確保 Gemfile.lock 中的目前版本存在於本地 git 儲存庫中。透過執行此動作,Bundler 會強制您擷取遠端中的最新變更。

如果您不希望 bundler 執行這些分支檢查,您可以透過設定此選項來覆寫它

$ bundle config set disable_local_branch_check true
在 GitHub 上編輯此文件,如果您發現錯誤或發現缺少某些內容。