LoginSignup
17
11

More than 3 years have passed since last update.

【Rails6】rails new で bundler: failed to load command: spring が出た。問題はbundler2.1.4かRuby2.7にあるようだが.....

Last updated at Posted at 2020-04-23

この問題については、開発者の方々が尽力してくださっているのですがまだ完全な解決には至っていないようです。
私もいくつかの方法を試しましたが、どうやら自分の環境を操作して解決できるレベルではないようなので、後述の「回避方法」に落ち着きました。

こちらの記事やgithubのissueで問題の内容は確認できます。
Bundler が Ruby 2.7 で変な件
bundler 2.1.4 issue #3257

あれこれ試しており、同じ記事で扱うべきでないと感じる部分もあるかと思いますがご容赦ください。
当問題において参考になるかと思われるのは「解決するかもしれない方法」までとなっております。



追記(2020/6/14)
@okuramasafumiさんからコメントをいただきました。
下記のコマンドで該当エラーが発生しなくなったことを確認したので追記します。
gem update --system

issueはこちらで確認できます。
https://github.com/rubygems/rubygems/issues/3284#issuecomment-636490794

環境

Mac : macOS Catalina 10.15.4
Rails : 6.0.2.2
Ruby : 2.6.3, 2.7.0, 2.7.1 (3バージョンで同様のエラーが発生しました)
bundler : 2.1.4

発生したエラー

$ rails new アプリ名
# ~略~
bundler: failed to load command: spring (/Users/ユーザー名/アプリ名/vendor/bundle/ruby/2.6.0/bin/spring)

「bundler:~」の部分だけ赤文字だったので気になって調べ始めたのですが正常にインストールは完了していたので無視してもいいのかもしれません。

$  gem list bundler

*** LOCAL GEMS ***

bundler (2.1.4, default: 2.1.2)

bundler2.1.2がdefaultになっているのも問題がある?ようです。

回避方法

bundler2.1.4に関係する問題のようなのでbundlerのバージョンを2.1.2に落とします。

$  gem uninstall bundler
Gem bundler-2.1.2 cannot be uninstalled because it is a default gem
Remove executables:
    bundler

in addition to the gem? [Yn]  y
Removing bundler
Successfully uninstalled bundler-2.1.4

$  gem list bundler

*** LOCAL GEMS ***

bundler (default: 2.1.2)

デフォルトに設定されているのでbundler2.1.2はアンインストールできないとのメッセージが表示されました。
バージョン指定したほうがよかったですね。
しかしyesで進めるとbundler2.1.4は正常にアンインストールされました。

これで“rails new app名”するとタイトルの警告は表示されませんでした。

解決するかもしれない方法

参考 : ArgumentError: Trying to register Bundler::GemfileError for status code 4 but Bundler::GemfileError is already registered #3284

開発者様たちの話によると、gemのバージョンを一度3.1.1にダウングレードしてから、再度最新バージョンにアップグレードさせるといいようです。

$ gem update --system 3.0.8 && gem update --system

こちらの記事も参考になりました。
【Ruby】Gem本体のアップデートについて

試したこと

その1

こちらの質問の「解決した方法」を参考に次のコマンドを実行。

$ rails new app名 --skip-bundle
# ~略~
Could not find gem 'rails (~> 6.0.2, >= 6.0.2.1)' in any of the gem sources listed in your Gemfile.
Run `bundle install` to install missing gems.

エラーでこちらは処理が中断されました。
こちらはGemfileが存在しないからそもそも出来るわけが無かったのですが、それを理解できていなかったのでこちらに関しても調べました。
今回の内容とは関係ないので別にしてあります。気になる方はどうぞ。
rails new app名 --skip-bundleってなに?

その2

*こちらは「その1」関連で試した内容なのですが結果としてgemが書き換わっているので試した手順として書いておきます。

gemの確認

$ gem list rails

*** LOCAL GEMS ***

rails (6.0.2.2, 6.0.2.1, 5.6.0)
rails-dom-testing (2.0.3)
rails-html-sanitizer (1.3.0)
sprockets-rails (3.2.1)

railsのgemが複数ありますが、いままでこれで動いていました。
一応一つにしてみます。

$ gem cleanup

$ gem list rails

*** LOCAL GEMS ***

rails (6.0.2.2)
rails-dom-testing (2.0.3)
rails-html-sanitizer (1.3.0)
sprockets-rails (3.2.1)

railsは一つになりましたがこれでもエラーが消えないので全てのgemを確認。

$ gem list

*** LOCAL GEMS ***

actioncable (6.0.2.2)
actionmailbox (6.0.2.2)
actionmailer (6.0.2.2)
actionpack (6.0.2.2)
actiontext (6.0.2.2)
actionview (6.0.2.2, 5.1.6)
activejob (6.0.2.2)
activemodel (6.0.2.2, 6.0.2.1, 5.1.6)
activerecord (6.0.2.2)
activestorage (6.0.2.2)
activesupport (6.0.2.2, 6.0.2.1, 5.1.6)
# ~略~

一部、前バージョンが残っていたので一つずつ手作業で消去する。(なぜ消えるものと残るものがあるのだろう?)

$ gem uninstall gem名 -v バージョン

gemをすっきりさせてもう一度rails newを試すものの結果は変わらず。

その3

もっとよく検索をしてみると開発者様たちが同様の内容で議論をされていました。
「解決方法(未確認)」にも載せたこちらの内容です。
ArgumentError: Trying to register Bundler::GemfileError for status code 4 but Bundler::GemfileError is already registered #3284

話し合われているのは「解決方法(未確認)」の手順でいいと思うのですが、私は理解が足りず次の3つを試した結果、解決に至りませんでした。
新しくrubyをインストールした場合“gem update”をしないとrubygems-update自体がインストールされなかったのでこの手順ではダウングレードはされなかったようです。
「rubygems-updateはソフトウェアのアップデート」というふうに公式に書かれていました。
rubygems-update

$ gem update --system #バージョンを記載しない場合最新バージョンになる

$ gem uninstall rubygems-update

$ gem install rubygems-update -v 3.1.1

$ gem update

その4

Rubyのバージョンを調べたところ、最安定版が2.7.1に更新されていたのでバージョン変更と現在インストールしているRubyの削除。
*rbenvでバージョン管理をしているためその手順になります。詳しくは他記事に譲ります。

$  rbenv versions #インストールされているバージョンの確認
  system
* 2.7.0 (set by /Users/ユーザー名/.ruby-version)

$  rbenv install --list #インストールできるバージョンの確認。最新がなければhomebrewのアップグレード

$  rbenv install 2.7.1 #インストールしたいバージョンを指定してインストール

$  rbenv local 2.7.1 #ローカルのバージョン切り替え

$  rbenv uninstall 2.7.0
rbenv: remove /Users/ユーザー名/.rbenv/versions/2.7.0? [yN] #削除しないとエラーの原因になるのでyes

$  rbenv versions #再度確認(実際に上記の手順をするときはもっと細かく確認したほうがいい)
  system
* 2.7.1 (set by /Users/wm/.ruby-version)

$  rbenv rehash #詳しくはわからないがするべきらしい

その5

$  rails -v
Rails is not currently installed on this system. To get the latest version, simply type:

    $ sudo gem install rails

You can then rerun your "rails" command.

Rubyのバージョンを変えたことでrailsのgemそのものが無くなったようなので指示通りにインストールするもバージョンが表示されず。

$  sudo gem install rails
# ~略~ 正常に完了
$  rails -v
Rails is not currently installed on this system. To get the latest version, simply type:

    $ sudo gem install rails

You can then rerun your "rails" command.

まずはこちらの記事とその参照先の記事
無限 sudo gem install rails にハマりました
MacOSX-Lionでrbenvを使ってRubyOnRailsの環境構築すると、~

export PATH="$HOME/.rbenv/bin:$PATH"
export PATH="$HOME/.rbenv/shims:$PATH"

この二つについて言及されていますが、私は“/bin”の方ですでに設定してあり機能していました。
一応“/shims”にして試してみたが解決せず...

その6

sudoがダメなら普通にと思うが今度は権限のエラー??
さらにアンインストールしようとすると存在せず、インストールしようとするとすでにある....

$  gem install rails
ERROR:  While executing gem ... (Errno::EACCES)
    Permission denied @ rb_sysopen - /Users/ユーザー名/.rbenv/versions/2.7.1/lib/ruby/gems/2.7.0/gems/rails-6.0.2.2/README.md

$  sudo gem uninstall rails
Password:
Gem 'rails' is not installed

$  sudo gem install rails
Successfully installed rails-6.0.2.2
Parsing documentation for rails-6.0.2.2
Done installing documentation for rails after 0 seconds
1 gem installed

もうここまできたら投げ出したかったのですが救ってくれるのはいつも先人の方々です。
gem install rails でハマった話
Permission denied @ rb_sysopen - /Users...の対応策

$ sudo chown -R ユーザー名:staff /Users/ユーザー名/.rbenv

$  rails -v
Rails 6.0.2.2

$  which rails
/Users/ユーザー名/.rbenv/shims/rails

教わった通りのコードを入力後、すぐはまたrailsのバージョンが表示されなかったのですが再インストールはする必要なく上記のようにバージョンが表示されました。
パスも正常に通っています。
完全な手順を忘れてしまい申し訳ないのですが、zsh_historyにもログが残っていなかったので特別なことはしていないと思います。

後書き

その後、“gem install rails”からの“rails new app名”ではタイトルの警告は出なかったのですが、“gem update”をするとまた警告が出るようになりました。

ここまできてから「回避方法」「解決するかもしれない方法」に行きついて結論が出たので飛んだ遠回りをしたものです。
勉強になったからいいのですが...

今回得た教訓は

  • 英語から逃げない
  • 理解せずにあれこれ試さない(気軽にsudoしない!)
  • まずは開発者に近い部分から調べてみる

なんてところでしょうか...
疲れました。。。

17
11
4

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
17
11