簡潔にまとめます
- railsのバージョンやGemfileでのバージョン指定を確認しましょう
- エラーログで検索してみましょう
- Gemfileのバージョン指定を変更してみましょう
概要
ローカル環境でRailsチュートリアル6版の2週目に挑戦中です。3章まで終わりましたが、Gemfileの内容を更新した後のbundle install / updateが度々エラーになります。対処法と原因についてまとめてみます。
以下は今回出てきたエラーの一例です。
$ bundle update
Fetching gem metadata from https://rubygems.org/............
Resolving dependencies...
Bundler found conflicting requirements for the Ruby version:
In Gemfile:
Ruby
guard (= 2.16.2) was resolved to 2.16.2, which depends on
Ruby (>= 1.9.3)
listen (= 3.1.5) was resolved to 3.1.5, which depends on
Ruby (>= 2.2.3, ~> 2.2)
pg (= 1.1.4) was resolved to 1.1.4, which depends on
Ruby (>= 2.0.0)
確認すべきこと・原因
「Railsチュートリアルの通りに進めているのに」と思いつつも、実は「RubyやRails、Gemfile各gemのバージョンが異なっている。」なんてことがあります。
ちなみに私は以下の環境で進めています。
- ruby 3.0.2p107
- Rails 6.1.4.1
チュートリアルの指定のバージョンではないですね。
…はい、チュートリアルの「エラーが出ないように指定のバージョンを使いましょう」という指示を無視した結果、エラーが出てきます(笑)
あとは、コピペしていたら起きにくいとは思うのですが、Gemfileの記述が間違っていないか確認してみましょう。もしかしたら存在しないgemの名前が書かれていたり、凡ミスのような打ち間違いをしているかもしれません。
対処法1:エラーログを読む、調べる
上でエラーの一例を示しました。例ではgemのバージョンによる依存関係が原因でエラーが起きているようです。
私は英語が苦手なので、とりあえず「読めない!」と思ったらgoogle先生に翻訳してもらいます。
翻訳結果から対処法が分かればいいのですが、初心者故にどうやって対処すればいいのか分かりません。ですので、エラーログをそのままgoogle検索してみます。エラーログが長すぎる場合は、重要な情報を示していそうな部分で調べてみます。
同じようなエラーが出ていて、解決方法を公開してくださっている方を見つけることができたらラッキーです。感謝しながら不具合を解消していきましょう。
対処法2:Gemfileのバージョン指定を変更する。
Rails newコマンドを実行したときに、Gemfileにはさまざまなgemの名前やバージョンが保存されます。Railsチュートリアルでは、チュートリアルを進める上で必要なgemとバージョンが記載されていますが、Gemfileの中身を見てみると必要なものが入っていなかったり、違うバージョンを指定していることがあります。
以下のGemfileのコード(一部)は、私が3章を終えた時点での状態です。Railsによって自動的に記述されたもの、チュートリアルに沿って導入したもの、バージョンの競合が起きたためにバージョンの指定を削除(最新版を導入するように)したものが書いてあります。
group :test do
gem 'capybara', '>= 3.26'
gem 'selenium-webdriver'
gem 'webdrivers'
#以下はチュートリアルに沿って導入。
gem 'rails-controller-testing', '1.0.4'
#以下、versionによる衝突を起こしたため最新版を導入
gem 'minitest'
gem 'minitest-reporters'
gem 'guard'
gem 'guard-minitest'
end
- まずはRailsで生成されたGemfile + 足りないものはチュートリアルの指示通りに記述
- うまくいかないときは、gemのバージョン指定を消してみる
1週目を完走したときは、一部はチュートリアルの指示通りのバージョンにしているものもありますが、ほぼすべてのgemを最新版の状態にしてみました。しかし、特に進行に影響のあるようなエラーが出たことはありません。
私の場合はバージョン指定をつけたり消したりしているうちに、うまくいく場合が多いです。
(おまけ) 第3章の初テスト実行時にエラー
せっかくなのでタイトルとは関係ないのですが、3章で体験した別のエラーについても書いておきます。
中盤に差し掛かってテストを実行した際にエラーが出ました。
$ rails test
/Users/(中略)/kernel_require.rb:34:in `require': cannot load such file -- rexml/document (LoadError)
英語読めないんですけど、なんとなく「読み込めないよ、ロードできてないよ」って言われている気がします。
エラー文の以下の部分をコピペして検索してみます。
`require': cannot load such file -- rexml/document (LoadError)
すると同じエラーについてまとめてくださっている方を発見しました。
Rails 6.1 + Ruby 3.0.2でテスト時にエラーがでる
対処法:「rexml」を導入
上記のページを参考に、Gemfileにrexmlを追記
# rails test実行時にエラー、必要みたいなので導入
gem 'rexml'
これでbundle installするとテストが無事実行できるようになりました!