v-crn Code Log

主に備忘録

bundle, Gemfile, Gemfile.lock

f:id:v-crn:20190702192828p:plain

本記事は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

を実行します。複数のバージョンがインストールされている場合、選択肢が出現するので対象のバージョンを選択します。