Docs header transparent bg

Gitリポジトリからのgemインストール方法

このドキュメントは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'

カスタムGitソース

上記で使用されている: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ショートカットをオーバーライドすることをお勧めします。

ローカル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でこのドキュメントを編集する(エラーを見つけた場合、または不足しているものがある場合)