このドキュメントはBundler 2.1以降を対象としています。Bundler 2.0以前(既に非推奨)を使用している場合は、bundle config set X Y
ではなくbundle config X Y
を使用してください。
Bundlerは、Gitリポジトリから直接gemをインストールできます。Gitを使用してgemをインストールするのは、Gemfileにgemを追加するのと同様に簡単です。
RubyGemsにはGitからのgemを扱う機能がないため、Gitリポジトリからインストールされたgemはgem list
には表示されません。ただし、Bundler.setup
を実行後には使用できます。
ルートに.gemspecファイルを持つGitリポジトリからのgemを指定する
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: 'git@github.com:rack/rack.git'
gem 'rack', git: 'git://github.com/rack/rack.git'
GitリポジトリのサブモジュールもBundlerで展開する必要があることを指定する
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'
:branch
や:ref
など、通常の:git
オプションはすべて適用されます。
gem 'rails', github: 'rails', ref: 'a9752dcfd15bcddfe7b6f7126f3a6e0ba5927c56'
Bitbucket(:bitbucket
)とGitHub Gists(:gist
)にも同様のショートカットがあります。
gem 'keystone', bitbucket: 'musicone/keystone'
gem 'my_gist', gist: '4815162342'
上記で使用されている:github
ショートカットは、Bundlerの組み込みGitソースの1つです。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'
これで、リモート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