はじめに
ふと、bundle installをした時に、下記のエラーが出た
Running bundle update will rebuild your snapshot from scratch, using only the gems in your Gemfile, which may resolve the conflict.
調べたらbundle update
をしていないことが原因だったのだが、そもそも"install"と"update"の違いがまだきちんと理解できていないことに気づいてこの記事をまとめようと思った。
bundlerについて
そもそもbundlerについてもう少し詳しく述べておくと、「gemの依存関係のものを一括で扱ってくれる」ものである。つまり一つの機能を用いようとする時に、いくつものgemをインストールしなければならない時があるかもしれないが、bundlerを用いると依存関係を持っている複数のものを一括でインストールしてくれるというものだ。
これは確かに便利なのかもしれない!
gemfile と gemfile.lock
gemfileはgemをインストールするための設計図と呼ばれ、gemfile.lockは実際にインストールした結果図と例えても良い。
つまり、gemfileに書かれているgemのみならず一括でインストールしたものを、gemfile.lockにまとめて記述されていることとなる。
これは知らなかった、gemfile.lockにそんな役割があるとは。
bundle install
これを踏まえてbundle install
について考えていく。
bundle install
はgemfile.lockに記載されている内容を踏まえて、gemをインストールしていく。ちなみに、この時にgemfile.lockには記載されていないがgemに記載されているgemなどは、インストールした後にgemfile.lockも更新する
bundle update
bundle update
はgemfileを元にgemのインストールを行う。そしてそのあとに、gemfile.lockを更新する。
まとめ
つまり、bundle update
はgemのバージョンを更新する時に用いる。bundle install
はgemfile.lockを更新しないため、gemfileに新しくgemを記述した時に使用する。
また、本番環境でbundle update
はgemのバージョンのズレが起きやすいため使用せず、bundle install
は新しい環境などで用いていくのが良い。