意外とよくわかっていないbundlerについて

Ruby

Railsを勉強するにあたり必要な概念であるbundlerについて今回は説明します。

ある参考書ではbundle exec rails new、他の参考書ではrails newと書いてあるものがあったり、bundle installbundle updateという似たようなコマンドがあったりとbundlerは初学者にとってはよくわからないものだと思います。

今回は自分の理解の整理も兼ねて改めてbundlerとbundlerのコマンドについて説明をしようと思います。

こんな人に向けの記事です
  • bundle exec rails newとrails newの違いがわからない
  • bundler insatallとbundler updateの違いがわからない
  • Gemfileとbundlerの関係性がわからない

bundler

bundlerはgem同士の依存関係やgemのバージョンを管理するgemです。

gemは他のgemと依存関係になっているものが多く存在しています。

ですので、あるgemを利用したい場合は他のgemも合わせてインストールする必要があったり、gemのバージョンが異なっていると正しい挙動にならなかったりということが起こることがあります。

しかし、bundlerを利用することで依存するgemを一緒にインストールしてくれたりgemのバージョン管理ができたりするので、gemの依存関係によるバグなどが出にくくなります。

RailsアプリではGemfile, Gemfile.lockという形でgemの内容が管理されていますが、これらはbundlerによって作成・更新される成果物です。

bundlerを利用してGemfile・Gemfile.lockが作成された結果、複数の開発者間で同じ開発環境を共有することができるようになります。

また、bundlerを利用することでRailsのアプリごとにgemを管理することができるようになるため、例えば同じgemでもRailsアプリによって異なるバージョンを利用したい時などに役に立ちます。

bundlerの役割
  • 依存するgemを簡単に管理できる
  • Railsのアプリごとにgemを管理することができる
  • bundlerで作成されたgemのリストを共有することで複数の環境で同じ開発環境を共有できる

bundlerのコマンド

bundlerには様々なコマンドが用意されています。

ここではよく使うコマンドについて説明をしたいと思います。

bundle init

bundlerの初期設定をするものです。

bundl initにより、Gemfileが作成され、bundlerでgemを管理することができるようになります。

bundle install

bundle installはGemfileに記述された内容を元にgemをインストールするときのコマンドです。

Gemfileに書いてあるgemのうちインストールされていないものをインストールし、Gemfile.lockを更新します。

また--pathでbundlerがインストールするgemの場所を指定することができます。

パスを指定することで、例えば複数のアプリを開発している時に各アプリで利用されるgemが同じ場所にインストールされることがなくなり、バージョンの差異によるエラーの発生なども回避することができます。

bundle update

bundle updateはGemfileに記載されているgemのバージョンをアップデートするものです。

Gemfileの内容を元にgemをアップデートし、Gemfile.lockに記載されているgemのバージョンを更新します。

bundle exec

bundle execはbundlerでインストールされたgemを利用して実行する時に使うものです。

bundle installとbundle updateの違い

bundle installはGemfileに記載されているgemでインストールされていないものをインストールするのに対して、bundle updateはGemfileに記載されているgemのバージョンを更新するという違いがあります。

ですので、すでにインストールされているgemに対して更新しないのはinstall, 更新するのはupdateです。

これらの使い分けですが、基本的にbundle installしか業務では利用していないで、そこまで使い分けを意識する必要はないと思います。

新しいgemを追加するときはGemfileを更新してbundler install、古いバージョンにバグがあるときはGemfileに書いてあるバージョン部分を更新してbundle installのような感じで、bundle installだけで事は足ります。

bundle exec rails newとrails newの違い

bundle execはbundlerで管理されたrails gemを利用するのに対して、rails newはシステム(ローカル環境)のrails gemを利用するという違いがあります。

例えばあるアプリでは5系のrails, あるアプリでは4系のrailsというようにRailsアプリのバージョンが違う時のために役に立ちます。

単にrails newで実行した場合はrailsのバージョンがシステムで管理されているgemに決まってしまうため、アプリごとにバージョンを変えるというのが難しくなります。