[ruby,rails]gemのバージョンのdefault設定解除方法


1.エラーの例

$gem uninstall railties -v '6.0.2.1' #アンインストールコマンドです
~中略~
gem "railties" cannot be uninstalled because it is a default gem #エラー文

railsやその周辺のgemをダウングレードするべく、最新のgemに対し上記のアンインストールコマンドを打ったところその下のようにエラー文をだしました。そのエラー解決についてあまりネット上に記載がなかったので、解決方法を記載します
※railsなどのgemのバージョンを下げるには"インストールされている最新のgemのバージョン=反映させたいgemバージョン"とするため、必要なバージョン以上の全てのバージョンをアンインストールする必要があります

2.エラーの原因

コマンドの意味をよく調べずにgem update --defaultというコマンドを打ったところ、local( /Users/kontatomoya/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0)のgemの最新バージョンが一度にインストールされ、かつ最新バージョンがデフォルトに設定されてしまったのが原因でした

# (gem update --default コマンド入力後)
$ gem list #projectのGemfileにあるgemで使用可能な(もともとpcにinstallされている)gemのバージョンを調べるコマンドです。
       (localのどこで打っても同じものが出てきます)
〜前略〜
rails (default: 6.0.2.1, 5.2.4.1)  #このdefault:と付いているバージョンはdefault設定を解除しないとアンインストールすることができません
rails-controller-testing (1.0.4)
rails-dom-testing (2.0.3)
rails-html-sanitizer (1.3.0)
railties (default: 6.0.2.1, 5.2.4.1) #上記と同じです
〜後略〜

3.解決方法

下記の順にコマンドを打っていただければdefaultを解決できます

$ gem environment #gemのインストール先のパスを確認します
RubyGems Environment:
  - RUBYGEMS VERSION: 2.7.6
  - RUBY VERSION: 2.5.1 (2018-03-29 patchlevel 57) [x86_64-darwin18]
  - INSTALLATION DIRECTORY: /Users/kontatomoya/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0
  #↑この行でgemのインストール先のパスを確認します
 〜後略〜

$ cd #ホームディレクトリへ移動
$ cd /Users/kontatomoya/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0 
 #上記で確認したパスに移動します(今回は筆者のディレクトリで記述します)
$ ls #中を確認します
build_info  doc gems
cache   extensions  specifications ←この中にdefault設定が記述されています

$ rm -rf specifications/default/ 
 #specificationsのなかのdefaultディレクトリ削除します(これでdefaultが解除されます)

$ gem list #defaultが解除されているのを確認します
〜前略〜
rails (6.0.2.1, 5.2.4.1) #defaultが解除されているのが確認できます
rails-controller-testing (1.0.4)
rails-dom-testing (2.0.3)
rails-html-sanitizer (1.3.0)
railties (6.0.2.1, 5.2.4.1) #defaultが解除されているのが確認できます
〜後略〜

4.(補足)ダウングレード

1~3が終わった状態で下記のコマンドを打つことでダウングレードすることができます(当初の目的がダウングレードだったので忘れずに行いましょう)

$gem uninstall railties -v '6.0.2.1'
$gem uninstall rails -v '6.0.2.1'

$ gem list
〜前略〜
rails (5.2.4.1) #6.0.2.1が削除されているのが確認できます
rails-controller-testing (1.0.4)
rails-dom-testing (2.0.3)
rails-html-sanitizer (1.3.0)
railties (5.2.4.1) #6.0.2.1が削除されているのが確認できます
〜後略〜

5.注意点

default値を消すことができないことに焦ってgem uninstall -I -a -x --user-install --force(クリーンアップ(強制削除))をしてしまわないようにしましょう。このコマンドでもdefault値は消せず、gemの最新バージョン以外の全てのバージョンと、初期から入っていない全てのgemが削除されます。筆者は焦ってこのコマンドを打ってしまい、macのタイムマシーンで元に戻すことにしました。バックアップしてない人は手詰まり(元のバージョンとすることができない状態。最新バージョンならgem install bundlerなどで必要なものだけのインストールはできますが...)になってしまうので注意しましょう。

6.参考

bundled gem と default gem の違い
https://blog.n-z.jp/blog/2016-09-10-bundled-gem-and-default-gem.html