Ruby
Rails
Gem

bundle install と bundle updateの違いについて

More than 3 years have passed since last update.

Rails初心者あるあるで、「bundle install と bundle updateの違いが、分からない」というものがあります。かくいう私も、良く分からないまま過ごしてきてしまったので、ここで一旦調べてみました。


事前知識

bundle installbundle updateの違いについて、理解するためには、まずgemfile と gemfile.lock の違いについて、そしてBundlerについて学ぶ必要があります。


Bundlerについて

Bundlerはgemを管理するためのgemです。Bundlerを使用することでbundle installbundle updateコマンドを使用することができるようになります。

https://github.com/bundler/bundler


gemfileについて

gemfileはgemをインストールするための「設計図」のようなものです。私たちは、基本この「設計図」に、自分のアプリケーションに必要なgemを記述します。


gemfile.lockについて

gemfile.lockは、実際にgemをインストールした後の、「結果図」のようなものです。gem同士は関連し合っていることが多いので、gemfileに書いてあるgemの他にも必要なgemが生じます。Bundlerは、それらを自動でインストールし、gemfile.lockに記述します。


なぜgemfile.lockが必要なのか

gemfileは設計図です。インストールするgemしか記述されていません(gemのバージョン指定することはできます)。また、gemfileには、gemに関連するgemも記述されていません。

この状態だと、本番環境と開発環境でインストールされるgem,gemのバージョンを統一することができません。gemをインストールした時期によってバージョンが変わってしまうからです。しかし、gemfile.lockを使用することで、どの環境でも同じgem、gemのバージョンを使用することができるようになります。

これで、必要な事前知識は終わりです


bundle install と bundle updateについて

bundle コマンドを学ぶためにの事前知識を得ることができたので、本題に移りましょう。


bundle install

bundle installを実行すると、railsは、gemfile.lockを元にgemのインストールを行います。この時、gemfile.lockに記述されていない、且つgemfileに記述されているgemがある場合、そのgemとそのgemに関連するgemをインストール後、gemfile.lockを更新します。


bundle update

bundle updateを実行すると、Bundlerは、gemfileを元にgemのインストールを行います。その後、gemfile.lockを更新します。


これら2つのコマンドの使い分けについて

bundle updateは文字通り、gemのバージョンを更新する時に使用します。これは、bundle installコマンドはgemfile.lockにあるgemについては、更新しないためです。但し、bundle updateは、本番環境で安易に実行しないでください。gemのバージョンのズレが起こり、クラッシュする可能性があります。bundle updateは、必ず、ローカル環境で実行してください。

bundle installは、新しい環境や、gemfileに新しくgemを記述した時に使用します。


まとめ

今回は、初心者がつまづきやすい、bundle コマンドについて記述しました。

もっと深く知りたいという方は以下の文献等を参考にしてみると良いんじゃないでしょうか。

http://saj-kz.hatenablog.com/entry/2014/04/21/005845

http://qiita.com/YusukeHigaki/items/0314e2ec1d13cc5d4c99