Railsを勉強するにあたり必要な概念であるbundlerについて今回は説明します。
ある参考書ではbundle exec rails new
、他の参考書ではrails new
と書いてあるものがあったり、bundle install
とbundle 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アプリによって異なるバージョンを利用したい時などに役に立ちます。
- 依存する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に決まってしまうため、アプリごとにバージョンを変えるというのが難しくなります。