Rails初心者あるあるで、「bundle install と bundle updateの違いが、分からない」というものがあります。かくいう私も、良く分からないまま過ごしてきてしまったので、ここで一旦調べてみました。
事前知識
bundle install
とbundle update
の違いについて、理解するためには、まずgemfile と gemfile.lock の違いについて、そしてBundlerについて学ぶ必要があります。
Bundlerについて
Bundlerはgemを管理するためのgemです。Bundlerを使用することでbundle install
やbundle update
コマンドを使用することができるようになります。
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 コマンドについて記述しました。
もっと深く知りたいという方は以下の文献等を参考にしてみると良いんじゃないでしょうか。