Docs header transparent bg

如何从 Git 仓库安装 gem

本文档适用于 Bundler 2.1 或更高版本。如果您仍在使用 Bundler 2.0 或更早版本(已弃用),请使用 bundle config X Y 而不是 bundle config set X Y

Bundler 能够直接从 Git 仓库安装 gem。使用 Git 安装 gem 与在 Gemfile 中添加 gem 一样简单。

请注意,由于 RubyGems 缺乏处理来自 Git 的 gem 的能力,因此从 Git 仓库安装的任何 gem 不会显示在 gem list 中。但是,它们在运行 Bundler.setup 后将可用。

指定 gem 应该来自根目录包含 .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'

如果 gem 位于 Git 仓库的子目录中,则可以使用 :glob 选项指定其 .gemspec 的位置

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

指定包含多个 .gemspec 文件的 Git 仓库应被视为 gem 源

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

从前面的示例中,您可以指定特定的 ref、分支或标签

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 仓库指定 ref、分支或标签的工作方式完全相同

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: '[email protected]: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,可以使用简写形式

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 Gist(: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'

现在,Bundler 将使用本地覆盖而不是检出远程 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 上编辑此文档,如果您发现错误或遗漏内容。