RubyonRailsチュートリアル2章

bundle installできない

railsチュートリアルを動画、書籍を使って進めていく中で、Gemfileを書き換えた後に

bundle install –without productionが実行できない…

なぜなんだ。うーん。

結論

bundle installではなくてこの場合はbundle updateで解決した。

勉強のためにもできる限り詳しく調べてみよう

下記がbundle install –without productionを実行したターミナルの画面です。

ubuntu:~/environment/toy_app (master) $ bundle install --without production

The dependency tzinfo-data (>= 0) will be unused by any of the platforms Bundler is installing for. Bundler is installing for ruby but the dependency is only for x86-mingw32, x86-mswin32, x64-mingw32, java. To add those platforms to the bundle, run `bundle lock --add-platform x86-mingw32 x86-mswin32 x64-mingw32 java`.
Fetching gem metadata from https://rubygems.org/...........
Fetching gem metadata from https://rubygems.org/.
You have requested:
  listen = 3.1.5

The bundle currently has listen locked at 3.7.0.
Try running `bundle update listen`

If you are updating multiple gems in your Gemfile at once,
try passing them all to `bundle update`

エラーメッセージがふたつある。

なんて言っているかgoogle翻訳を駆使する。

バンドルは現在、3.7.0でリッスンロックされています。
`bundle update listen`を実行してみてください

Gemfile内の複数のgemを一度に更新する場合は、
それらすべてを `バンドルアップデート`に渡してみてください

Gemfileを書籍からコピペしているので、一気に更新すればいいやってことで

bundle update を実行

he dependency tzinfo-data (>= 0) will be unused by any of the platforms Bundler is installing for. Bundler is installing for ruby but the dependency is only for x86-mingw32, x86-mswin32, x64-mingw32, java. To add those platforms to the bundle, run `bundle lock --add-platform x86-mingw32 x86-mswin32 x64-mingw32 java`.
Fetching gem metadata from https://rubygems.org/...........
Fetching gem metadata from https://rubygems.org/.
Resolving dependencies....
Using rake 12.3.3 (was 13.0.6)
途中同じような内容なので省略してます
Using spring 2.1.0 (was 2.1.1)
Using spring-watcher-listen 2.0.1
Using sqlite3 1.4.1 (was 1.4.2)
Using turbolinks-source 5.2.0
Using turbolinks 5.2.0 (was 5.2.1)
Using web-console 4.0.1 (was 4.2.0)
Using webdrivers 4.1.2 (was 5.0.0)
Using webpacker 4.0.7 (was 4.3.0)
Bundle updated!

とおった!!

…そもそもbundle installとbundle updateは何が違うんだ??

bundle installはBundler(公式サイト)の日本語翻訳サイトを確認すると

説明

Gemfile(5)に指定されたGemをインストールします。 もし、初めてのbundle install(そして、Gemfile.lockが無ければ)の実行であれば、 Bundlerは全てのリモートの供給元からGemを取得し、依存関係を解決して、必要なGemをインストールします。

もし、Gemfile.lockが存在し、Gemfile(5)が更新されていないのであれば、 Bunlderはリモートの供給元からGemを取得しますが、依存性の解決を行うのでは無く、 Gemfile.lockに指定されている依存性を使用します。

もし、Gemfile.lockが存在し、Gemfile(5)が更新されているのであれば、 Bundlerは更新されていないGemに対しては、Gemfile.lock内の依存性を使用しますが、 更新されたGemに対しては依存性の再解決を行います。 この更新処理についてより詳しく知りたければ、「保守的な更新」以降を参照してください。

保守的な更新

要約: 一般的にはGemfile(5)の変更後には、 Gemfile(5)内の他のGemが変更によって影響(衝突?)を受けないことを確かめるために、 まずbundle installを試すべきです。 もしそれが動作しなければ、bundle update(1)を実行して下さい。

Ruby STUDIO

https://ruby.studio-kingdom.com/bundler/bundle_install/

そもそもGemとGemfileと、Gemfile.lockって??

  • Gemとは

Rubyのライブラリで、

簡単に言うと、自分では実装するのが大変な機能を簡単に実装するためのパーツの集合体のようなもの

有志の開発者が他の人も簡単に使えるように開発したもの

ちなみにbundle installやupdateだのやってますが、bundlerはGemのバージョン管理のためのツールです。

  • Gemfileとは

gemをRailsアプリで使用するためにこのファイルにgemを記述します。

bundle install でインストールされるgemはどこに書くの??

その回答としては、

gemはGemfileに書きます。

ただGemfileに書いただけではインストールされていませんって感じです。

下記は参考です。

Gemfileには、Rubyコードを実行するために必要なGemの依存関係が記述されます。

Gemfileは、コードが含まれるディレクトリのルートに配置して下さい。 例えば、Railsアプリケーションであれば、Rakefileと同じディレクトリに配置して下さい。

Ruby STUDIO

https://ruby.studio-kingdom.com/bundler/gemfile/
  • Gemfile.lockとは

Gemfileに書いたgemをインストールするとここが更新されます。

つまり実際にインストールされているgemがここに表示されます。

ここまでまとめると、

gemというRubyの便利ツールがあって、

そのgemを使いたい時はGemfileに書いて、

Gemfileに書いたgemをインストールし、

Gemfile.lockの記述を更新するコマンドが、

bundle installとbundle updateということになるわけです。

やっと最初のinstallと updateの差ですが、

installはGemfile.lockとGemfileに書かれている差分を更新する。

installではGemfileに書いたgemを見て他のgemとの依存性を確認して更新する

仮に既にGemfile .lockにA 1.0.0というgemがあって新しくA 2.0.0に更新したいと思った際に

GemfileにA 2.0.0と書いて

bundle installすると

Gemfile.lockを見てA 1.0.0とA 2.0.0がそれぞれ依存している他のgemとの依存性をチェックして

A 1.0.0が依存しているgemがB 1.1.0で

A 2.0.0が依存しているgemがB 2.0.0の場合

A 2.0.0が依存しているB 2.0.0に更新してくれる。

がしかし、

他のgem(C 1.0.0)も存在していた場合は、

C 1.0.0というgemが依存しているgem Bの条件はB >= 1.0.0でそれを満たすB 1.1.0がGemfile.lockに書かれていたとすると

C 1.0.0が依存しているB 1.1.0とA 2.0.0が依存しているB 2.0.0はどっちを使うの??ってなるためinstallできない。

じゃどうすればいいの??

ここでbundle updateを使う。

updateは指定されたgem(指定されなければ全てのgem)を更新する。Gemfile.lockに指定されている過去にインストールされているgemを全て無視して、Gemfileに書かれたgemの依存性を改めて確認して全て更新する。

そのため

C 1.0.0が依存しているgem Bの条件はB >= 1.0.0で、

A 2.0.0が依存しているのはB2.0.0

なので

両方の条件を満たすB 2.0.0に更新しますね

となる。

長くなりましたがこんな感じでしょうか。

間違いや、これはもっとこう言った方がわかりやすいよ!

などございましたら、ご指摘やアドバイスとしていただけるととてもありがたいです。

rubyのイメージ画像
最新情報をチェックしよう!