Rubyバージョンが切り替わらない? rbenvがバージョンを決める順番について 

## はじめに
最近、rbenvでどうしてもrubyのglobalバージョンがうまく切り替わらなくて、困っていました。
色々検索して、複数の記事を参照して設定変更したりしたけど、解決できていません..
そして、stack overflow経由して、rbenvのドキュメントにたどり着き、解決できました。
rbenvがどうやってrubyバージョンを決めるのか、についてもようやく理解できたので、メモとして記録しておきます。

##  rbenvでRubyのバージョンを確定する順番
[rbenvドキュメント　Choosing the Ruby Version](https://github.com/rbenv/rbenv#choosing-the-ruby-version)によると、
rbenvが利用するrubyバージョンを確定する順番は、
1. RBENV_VERSION環境変数を確認する。もし指定があれば、そのバージョンにする。RBENV_VERSION環境変数は`export RBENV_VERSION= x.x.x`コマンドラインで切り替えられる。(`set by`部分は`RBENV_VERSION environment variable`になる。)

2. `.ruby-version`ファイルを確認する。まずスクリプトを実行しようとしているディレクトリとその親ディレクトリ、ファイルシステムのルートに達するまで検索して、最初に見つかった`.ruby-version`ファイルにあるバージョンを指定する。

3. そして、カレントディレクトリとその親ディレクトリから検索して、ファイルシステムのルートに達するまで、最初に見つかった`.ruby-version`ファイルにあるバージョンを指定する。`rbenv local`コマンで、カレントディレクトリにある`.ruby-version`ファイルを修正できる。

4. 最後にglobal `~/.rbenv/version`ファイルを確認する。`rbenv global`コマンで指定できる。もしglobalバージョンファイルが存在しない場合、rbenvは`system` Rubyを利用する。 （いわゆるPATHが通っていない状況）

つまり、rbenvは RBENV_VERSION > .ruby-version > ~/.rbenv/version の確認順番でrubyバージョンを決める。

ドキュメントのほか、こちらの記事も合わせて[rbenvでRubyのバージョンを指定する方法](https://qiita.com/makoto_kw/items/cc73b628c9ef039f6e6f)も参照できる。

## Rubyバージョンが切り替わらない時、他参照できる記事

[Rubyのバージョンが切り替わらない時の対処法！](https://qiita.com/opiyo_taku/items/3312a75d5916f6cd32b1)
[rbenvでバージョンがうまく切り替わらなかった時にやったこと](https://qiita.com/akatsuki174/items/c0384b9903b4b5cbbdaf)
[[Ruby]rbenvでバージョンが切り替わらない時にやるべきこと](https://qiita.com/Jackson123/items/66850d6de6622c82cd00)

ほとんどの場合はこちらの記事を参照して、解決できるはずと思うけど、私の場合は、解決できなかった...
## 今回の状況: globalバージョンを設定しても、切り替わらない
```
$ rbenv global 2.7.4 

$ rbenv versions     
  system
* 2.6.9 (set by /Users/username/.ruby-version)
  2.7.4
  3.1.1
```
globalバージョン指定したけど、切り替わっていない

### PATHの設定ができているけど
`open ~/.zshrc` で確認したら、既にPATHが入っている
```
export PATH="$HOME/.rbenv/bin:$PATH"
eval "$(rbenv init - zsh)"
```
which rubyで確認して、経路は問題なさそう
```
$ which ruby
/Users/username/.rbenv/shims/ruby
```
### `.rbenv/version`内のバージョンが替わっているらしいけど
```
$ cat ~/.rbenv/version
2.7.4
```
早速他のバージョンでもう一度試したら、確かに.rbenv/versionが反映できている
```
$ rbenv global 3.1.1  
$ cat ~/.rbenv/version
3.1.1
```
けど、rubyバージョンは切り替わっていない...
```
$ ruby -v
ruby 2.6.9p207 (2021-11-24 revision 67954) [x86_64-darwin20]
$ rbenv versions      
  system
* 2.6.9 (set by /Users/username/.ruby-version)
  2.7.4
  3.1.1
```
### `.ruby-version`が問題らしい
ここで気づいた点は、`* 2.6.9 (set by /Users/username/.ruby-version)`のところ。
他の記事を参照した時、rbenvがうまく動いたら、
`(set by /Users/username/.rbenv/version)`が表示されるべきだという。
なるほど、じゃ何でこの`.ruby-version`になっているだろう..?

## 解決策：ホームディレクトリ下に`.ruby-version`ファイルを置かないこと
検索キーワードを変えて再度検索したところ、この回答に辿り着いた
[rbenv not changing ruby version](https://stackoverflow.com/questions/10940736/rbenv-not-changing-ruby-version)(stack overflow上の英語質問)
>Finally, make sure your `$HOME` folder doesn't have a `.ruby-version` file that you may have created by accident if you were to have done `$ rbenv local <ruby-version>` in your `$HOME` folder.
> Doing `$ rbenv global <ruby-version>` modifies the `$HOME/.rbenv/version` file, and the existence of a `.ruby-version` file in the `$HOME` folder would override the version set by `$HOME/.rbenv/version`.

なるほど！　！　
rubyのglobalバージョンを切り替えようとして、`.rbenv/version`の内容が変更したとしても、`.ruby-version`ファイルがあるから、`.ruby-version`ファイルにあるバージョンが優先して設定される。

おそらく、誤ってでホームディレクトリで`$ rbenv local`を実行したから、`.ruby-version`ファイル生成された。
とりあえず早速ファイルを削除する！

### `.ruby-version`ファイルを削除したら、問題は無事解決！
早速ホームディレクトリ下の`.ruby-version`ファイルを削除して、バージョン変更してみると
```
$ rbenv global 2.7.4 

$ rbenv versions     
  system
  2.6.9 
* 2.7.4 (set by /Users/username/.rbenv/version)
  3.1.1

$ ruby -v           
ruby 2.7.4p191 (2021-07-07 revision a21a3b7d23) [x86_64-darwin20]
```
ようやくバージョンが切り替わった！
## `.ruby-version`と`.rbenv/version`の違い
ちなみに、この`.ruby-version`ファイルは何の役割だろう.
調べたら、下記の記事を見つけました。
[rbenv の global バージョンが変わらなくて困ったこと 《global と local》](https://qiita.com/yufuworks/items/08eafe9515e6c4045489)

>globalというのは、そのPCがデフォルトで使うバージョンを設定することです。
で、localってのがPCの中の一部、
例えば特定のプロジェクトファイル以下で使うバージョンを指定することです。
このlocalでのバージョン指定をしているのが.ruby-versionというファイルです。
このファイルがあるフォルダ以下には
.ruby-versionファイルに記載されたバージョンのrubyが動きます。

つまり、
通常globalバージョンを指定した時、`.rbenv/version`が動くけど、
localバージョンを指定した時、`.ruby-version`ファイルが生成され、`.ruby-version`ファイルに記載されたバージョンのrubyが優先して指定される。

### バージョン指定ができない時、`.ruby-version`ファイルもチェックして
こうみると、ホームディレクトリ以外のディレクトリでも、もし`.ruby-version`が存在する場合、このディレクトリ下でglobalバージョンを指定しようとしても、`.ruby-version`に記載されたバージョンの方が優先されるから、バージョンの切り替えができない?

検証として、localバージョンを指定したことあるディレクトリを見つけて、globalバージョン指定しようとしたら、何も替わってない。
```
$ rbenv global 3.1.1

$ rbenv versions    
  system
* 2.6.9 (set by /Users/username/app/.ruby-version)
  2.7.4
  3.1.1
```
なるほど、localバージョンが優先して指定されているから、globalバージョンが切り替わらない。

いや、ここまでみると、そもそもこれがlocalバージョンが指定できる仕組みだよね...
恥ずかしいけど、rubyバージョン切り替えの仕組みはようやく理解できた..

## 終わりに

今回私のケースは、本当に稀にある状況かもしれないが、(初学者としても笑われるかも..)
もし他の記事を参照して、PATH設定なども色々やったけど、まだ解決できていない時、`.ruby-version`もチェックしてみたら..との話でした。