本文档适用于 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'
上面使用的 :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
快捷方式。
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