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に更新しますね
となる。
長くなりましたがこんな感じでしょうか。
間違いや、これはもっとこう言った方がわかりやすいよ!
などございましたら、ご指摘やアドバイスとしていただけるととてもありがたいです。