gem installでpermissionエラーになった時の解決方法

##gemをインストールしようとするとエラーが出る...

rspecのgemをインストールした際に以下のようなエラーに遭遇しました。

```
$ gem install rspec
ERROR:  While executing gem ... (Gem::FilePermissionError)
    You don't have write permissions for the /Library/Ruby/Gems/2.6.0 directory.
```

エラーログをみると`You don't have write permissions`と書いてあります。

意味が理解できずに色々な記事を参照すると、どうやら「**システムのrubyを利用しているため、権限不足でgemのインストールができない状態**」らしいです。
ルート権限でシステムのRubyにインストールをしてもいいのですが、開発環境ではrbenvでrubyを管理することをおすすめしているそうなので、今回はその手順を踏んで行こうと思います。

以下では、今回遭遇したエラーをrbenvでRubyを管理することで解決するまでの手順について説明をします。


##現状の確認
まずはgemやrubyがどのパスを指しているのか現状の確認をします。
以下の結果からわかるように/usr/binというシステムのパスを指していることがわかります。

```
$ which gem
/usr/bin/gem
```
```
$ which ruby
/usr/bin/ruby
```

このパスをどちらもrbenvのパスに変えることが今回のゴールになります。

##そもそもrbenvとは何か
rbenvは、複数のRubyのバージョンを管理し、プロジェクトごとにRubyのバージョンを指定して使うことを可能としてくれるツールです。読み方は「アールビー・エンブ」または「アールベンブ」というらしいです。

以下のコマンドで導入されているrbenvのバージョンを確認できます。

```
$ rbenv versions
```

もし導入がまだならコマンドが見つかりませんという旨の以下のメッセージが出力されるはずです。

```
zsh: command not found: rbenv
```

## rbenvをインストールしてみよう

rbenvでrubyを管理するための手順について説明します。

まずはrbenvのインストールをします。

```
$ brew update
$ brew install rbenv ruby-build
```

もしここで

```
Error: Can't create update lock in /usr/local/var/homebrew/locks!
Fix permissions by running:
  sudo chown -R $(whoami) /usr/local/var/homebrew
```

というメッセージが出力されたら、メッセージの指示通りに以下のコマンドを実行してください。

```
$ sudo chown -R $(whoami) /usr/local/var/homebrew
```

「sudo」コマンドは「特定のコマンドの実行権限の許可をもらう」コマンドです。
「chown」コマンドは、指定したファイルやディレクトリのユーザー所有権（所有者）やグループ所有権（グループ）を変更します。ユーザー所有権は、ユーザー名やユーザーIDで指定し、グループ所有権は、グループ名やグループIDで指定します。
こうすることによって権限が付与され、インストールができるようになるはずです。


次にrbenvで管理されているrubyのバージョンを確認します。
以下のように、現在のrubyは`system`を利用していることがわかります。

```
$ rbenv versions
* system (set by /Users/username/.rbenv/version)
```

rbenvの管理下にrubyをインストールします。
インストールできるrubyのバージョンは以下のコマンドで確認ができます。

```
$ rbenv install -l
```

今回は最新版であるRuby 3.0.0をインストールします。

```
$ rbenv install 3.0.0
```

最新版のダウンロードは[こちら](https://www.ruby-lang.org/ja/downloads/)を見ると確認できます。

インストール後もう一度以下のコマンドを叩いてみます。
先ほどインストールした`3.0.0`というバージョンが新しく追加されていることがわかります。

```
$ rbenv versions
* system (set by /Users/username/.rbenv/version)
  3.0.0
```

`3.0.0`をglobalで利用するように変更します。
 なお、アプリごとにrubyのバージョンを変更したい場合は`rbenv local`コマンドを利用します。

```
$ rbenv global 3.0.0
```

上記コマンドを実行後、rbenvで管理されたrubyに変更されます。

```
$ rbenv versions
  system
* 3.0.0 (set by /Users/username/.rbenv/version)
```

##rbenvにPATHを通す

やることは主にふたつです。

1. ~/.zshrc(あるいは ~/.bash_profile )に任意のPATHを追記
2. source で反映させる。


###①デフォルトのシェルを確認

以下のコマンドでデフォルトのシェルを表示できます。

```
$ echo $SHELL
/usr/local/bin/zsh
```
zshの場合だとこのように出力されるかと思います。
ターミナルの設定ファイルが存在しない場合はシェルに応じた設定ファイルを作成してください。
- zshの場合 .zshrc

###②シェルに応じた設定ファイルを作成

```
$ cd ~
$ ls -a
```

ホームディレクトリに移動する　→　カレントディレクトリの情報を表示する。

.zshrc が存在しなければここで表示されません。
もし見当たらなければ以下のコマンドで作成してください。

```
$ touch .zshrc 
$ ls -a
```

touchは空ファイルを生成するコマンドです。
もうlsコマンドで一度確認すると.zshrcファイルが生成されているかと思います。

###③作成した設定ファイルを編集する

以下のコマンドを実行するとエディタが開くと思います。

```
$ open ~/.zshrc  
```

rbenvにパスを通すため、開いたシェルの設定ファイルに以下を追加します。

```
[[ -d ~/.rbenv  ]] && \
  export PATH=${HOME}/.rbenv/bin:${PATH} && \
  eval "$(rbenv init -)"
```

編集後、保存してください。

###④追記した内容を反映する

以下のコマンドを実行して、編集したファイルを反映させてください。

```
$ source ~/.zshrc 
```

以上でrbenvにパスを通す設定は完了です。

##設定したパスを確認する

はじめはシステムのパスを指していましたが、以下のようにrbenvのパスを指していることがわかります。

```
$ which ruby
/Users/username/.rbenv/shims/ruby
```

```
$ which gem
/Users/username/.rbenv/shims/gem
```

rbenvでrubyを管理することで、もともとエラーになっていた`gem install ~`を実行することができるようになりました。

##最後に

初学者の方にとっては環境構築は最初に立ち塞がる壁のような存在だと思います。
しかし、コツコツ勉強していると少しずつターミナルに羅列されるエラー文に抵抗力を持ち始め、ググりながらも自力でやっつけることができるようになります。
今回の記事がRubyを学ぶ初学者にとって小さな光明となれば幸いです。