bundle, Gemfile, Gemfile.lock
本記事はRubyプロジェクトが依存するGemを一括でインストールまたは更新する際に使うbundleコマンドについての解説です。
Bundler
BundlerはGemを管理するためのRubyプロジェクト用ツールです。プロジェクトの配布や複数人での開発など、さまざまな環境にプロジェクトが置かれることが想定される状況においても、Gemfileの内容さえ一致していれば実行環境を揃えることができます。
Bundler: The best way to manage a Ruby application's gems
bundleコマンド
bundle init
Gemfileの新規作成
カレントディレクトリに次の内容のGemfileを新規作成します。
# frozen_string_literal: true source "https://rubygems.org" git_source(:github) {|repo_name| "https://github.com/#{repo_name}" } # gem "rails"
bundle install
Gemの追加
プロジェクトのルートディレクトリに置かれたGemfileを基にGemパッケージをインストールするコマンドです。サブコマンドinstall
を省略することもできます。インストールの流れはルートディレクトリにGemfile.lockがあるかないかによって変わります。
インストールの流れ
Gemfile.lockがない場合
Gemfileに基づき、直接記述されていない依存Gemも含め、できる限り新しいバージョンのGemをインストールします。その際、インストールするGemの名前とバージョンをGemfile.lockに記録します。
Gemfile.lockがある場合
Gemfile.lockに基づき、Gemをインストールします。
Gemパッケージの保存先
単にbundle install
を実行すると、rbenv環境下では/Users/ユーザー名/.rbenv/versions/バージョン名/lib/ruby/gems
以下のディレクトリにGemがインストールされます。
bundle install --path ディレクトリパス
を実行すると、指定のディレクトリにGemをインストールすることができます。次のようにvendor/bundle
を指定先とするのが一般的です。
bundle install --path vendor/bundle
一度このコマンドを実行すると、BundlerがGemのインストール先を.bundle/config
というファイルに記録するため、次回以降はbundle install
コマンドでも指定ディレクトリにGemがインストールされます。
bundle update
Gemの更新
Gemfileに記述されたGemを更新し、Gemfile.lockに反映させます。
すでにインストールしたGemに変更を加えたい場合(Gemのバージョン変更、不要なGemの削除)にbundle update
を実行します。
引数にGemパッケージのリスト名を入れることで指定のGemパッケージのみ更新することも可能です。
例:
$ bundle update rails rake
bundle list
インストール済みGemの一覧
対象のRubyプロジェクトにインストールされているGemの一覧を表示します。
Gemfile
Rubyプロジェクトで使用するGemの依存関係を管理するファイルです。
記述形式
gem `Gem名`, `バージョン`, オプション
バージョン指定子
バージョン | 意味 |
---|---|
x.x.x |
バージョン固定 |
>= x.x.x |
x.x.x以上 |
>= x.x.x, < y.y.y |
x.x.x以上、y.y.y未満 |
~> x.x |
x.x.0以上、(x+1).x.0未満 |
~>
は悲観的バージョン指定子と呼ばれ、後方互換性を維持するために使われます。
たとえば、現在rails 5.2.3を使用しているとして、railsの開発者がバージョン5.3.0をリリースするまで互換性を維持してくれることを期待する場合、
gem 'rails', '~> 5.2.3'
と書くことができます。この場合、Bundlerはrails 5.2.4がリリースされれば更新しますが、5.3.0がリリースされても更新しません。
オプション
オプション | 意味 |
---|---|
:branch | 対象ブランチ |
:group / :groups | 環境(test/development/production) |
:git | gitリポジトリ |
:require | 必要なgem |
:platforms | 対象プラットフォーム |
:path | gemファイルのディレクトリを指定 |
Gemfile.lock
BundlerがGemfileを解析して得たGemの依存関係に関する情報を記録するファイルです。
Gemfile.lockの末尾には、最後にbundle install
あるいはbundle update
を実行した時点でのBundlerのバージョンが記録されています。
bundle install
あるいはbundle update
を実行するとき、使用しているBundlerのバージョンよりGemfile.lockに記載されているBundlerのバージョンの方が新しい場合、次のような警告メッセージが表示されます。
Warning: the running version of Bundler is older than the version that created the lockfile. We suggest you upgrade to the latest version of Bundler by running gem install bundler .
gem install bundler -v バージョン
コマンドを実行してバージョンを揃えると、警告メッセージは出なくなります。
古いバージョンをアンインストールしたいときには、
$ gem uninstall bundler
を実行します。複数のバージョンがインストールされている場合、選択肢が出現するので対象のバージョンを選択します。