RubyOnRails環境構築の流れ

## はじめに
Railsを学習する際に、Rubyのバージョン管理やRailsの環境に必要なパッケージのインストールなどよく理解せずにインストールしていました。
動くけどなぜこれが必要なのかを理解せずに進んでいるとモヤッとした気持ちがしたので、少しでも理解するために備忘録として残したいと思います。

## 前提
Homebrewはインストール済み
MacOs Catalina以降

## rbenvをインストール
### rbenvとは
Rubyのバージョン管理ツール。
複数のバージョンのRubyを管理してくれる。
```ruby
#インストール
$ brew install rbenv

#バージョン確認
$ rbnev -v
```

### パスを通すとは
コマンドを検索するパスを設定すること。
パスを通さないと毎回フルパス（`ディレクトリ/ディレクトリ/ディレクトリ/実行したいコマンド`）を指定してコマンドを実行しなければならない。
そこで、パスを通すことで実行したいコマンド名だけで実行できるようになる。
### 特定のプログラムのパスが通っているか確認する
表示された一番上のパスが採用される
```
$ where コマンド名

$ where git 
/usr/local/bin/git  #採用されるパス
/usr/bin/git
```
### パスの設定
```
$ echo 'export PATH="値"'
```
設定方法によって、追加するパスの優先順位を変更できます。
```
#追加したパスの優先順位が既存のパスより高い
$ echo 'export PATH="追加するコマンドのディレクトリパス:$PATH"' >> ~/.zshrc

#追加したパスの優先順位が既存のパスより低い
# echo 'export PATH="$PATH:追加するコマンドのディレクトリパス"' >> ~/.zshrc
```
＝の右側の＄PATHは設定している既存のパスです。
優先順位が高い方を先に記述します。

## rbenvにパスを通す
```
$ echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.zshrc
```
`export $PATH=$HOME/.rbenv/bin:$PATH`という記述でもパスを通すことはできるが、ターミナルを閉じると設定が消えてしまう。
そのため`~/.zshrc`ファイルにパスを移すことで設定が消えないようにする。

次にrbenvのshimsを有効にする
```
$ echo 'eval "$(rbenv init -)"' >> ~/.zshrc
```
`eval` - 文字列を評価（展開）して連結させる。`echo`コマンドだと単なる文字列として評価されてしまう。

`rbenv init -` -　以下の処理が実行される
  (1) ~/.rbenv/shims を環境変数PATHの先頭に追加する
  (2) コマンドの補完用のシェルスクリプトを読み込む
  (3) shimのrehash、すなわち rbenv rehash の実行
  (4) sh dispatcherをインストールする

上記(3)の`rbenv rehash`によって`~/.rbenv/versions/各バージョン/bin/`に配置されたgemのコマンドなど(psec,rubocop)が`~/.rbenv/shims/`にコピーされる。
そして上記(1)によってパスが通り、バージョンを気にせずコマンドが実行できるようになる。

ではgemを追加したときは、毎回`rbenv rehash`処理をしなければいけないのか？
違うみたいです。以下引用([rbenv rehashをちゃんと理解する](https://mogulla3.tech/articles/2020-12-29-01/))
>実はrbenvは gem install xxx をしたタイミングでhookスクリプトを噛ませていて、それが自動的に rbenv rehash を実行していたのである。よって自分で明示的に rbenv rehash を実行する必要はない。

ターミナルに設定を反映させる
```
$ source ~/.zshrc
```
### shimsとは
以下引用([Shimの意味](https://qiita.com/ironsand/items/4f0342f5914a9ae99b0e))
>プログラムのバージョン間の差異を埋める緩衝材のように使う薄いレイヤーみたいなものがShimです。

正直よくわかりませんが、例えば複数のバージョンのRubyで共通するコマンドをいちいち環境別に設定しなくても良くなるということでしょうか？曖昧です。

## Rubyのインストール
### インストールできるRubyのバージョンを確認する
```
$ rbenv install --list
```
エラーが出たら、指定されているコマンドを実行
```
$ rbenv install --list
ruby-build: definition not found: list
See all available versions with `rbenv install --list'.
If the version you need is missing, try upgrading ruby-build:

  brew update && brew upgrade ruby-build

$ brew update && brew upgrade ruby-build  #実行
```
バージョンを指定してインストール
```
$ rbenv install 2.7.5
```
インストールされたか確認
(systemはMacに標準搭載されているRuby。)
```
$ rbenv versions
* system  #アスタリスクは現在適用されているバージョンを指している。
  2.6.5
  2.6.6
  2.7.5
  3.1.1 
```

バージョンを切り替える
```
$ rbenv global 2.7.5
```
Ruby2.7.5のバージョンのコマンドを使用できるようにする
```
$ rbenv rehash
```
バージョンが切り替わったか確認
```
$ ruby -v

>> ruby 2.7.5
```

## Mysqlを用意する
Mysqlは最も広く普及しているデータベース。
アプリケーションのデータを保存するために設置します。

インストール
```
$ brew install mysql@5.7
```
Mysqlにパスを通す
```
$ echo 'export PATH="/usr/local/opt/mysql@5.7/bin:$PATH"' >> ~/.zshrc

#設定を反映
$ source ~/.zshrc

#バージョン確認
$ mysql --version
>> mysql  Ver 14.14 Distrib 5.7.41

#mysqlを起動
$ mysql.server start

#mysqlにルートユーザーとしてログイン
$ mysql -uroot

mysql> #mysqlのプロンプトが表示されたらログイン成功
```
mysqlの自動起動設定
```
#Homebrew serviceをインストール
$ brew tap homebrew/services

#mysqlの自動起動を設定する
$ brew services start mysql@5.7
```
`brew tap` - 公式以外のものを追加できるHomebrewのサブコマンド。
```
$ brew tap <userName>/<repository>
＃または
$ brew tap <url>
```

## RubyOnRailsをインストール
インストール
```
$ gem install rails -v '6.1.3.1'
```
railsコマンドを利用可能にする
```
$ rbenv rehash
```
バージョン確認
```
$ rails -v

>> rails 6.1.3.1
```

## bundlerのインストール
bundlerとは、gemのバージョンや依存関係を管理してくれるもの。

インストール
```
$ gem install bundler
```
バージョン確認
```
$ bundle -v

>> Bundler version 2.3.7
```

## yarnとwebpackerのインストール
yarnは、JavaScriptのパッケージ管理ツール。
Rails6でwebpackerが標準になったことにより、yarnをインストールする必要がある。

webpackerは、Rails上で実行されるJavaScriptの開発に必要なものを実装してくれるパッケージ。
webpackとは複数のファイルをまとめて出力してくれる、モジュールバンドラー。
yarnのインストール
```
$ brew install yarn
```

webpackerのインストール
```
$ rails webpacker:install
```

## node.jsをインストール
### node.jsとは
基本的にブラウザ上でのみ動けたJavaScriptを、サーバー上でも動かせるようにしてくれる「実行環境」。
node.jsによって、jacascriptがファイルの読み書きやネットワーク通信ができるようになる。

[Node.jsの公式サイトの手順](https://nodejs.org/ja/download/)に従ってNode.jsをインストール

## Railsアプリ作成
```:アプリを配置したいディレクトリ
$ rails new バージョン　アプリ名

$ rails new _6.1.3.1_ sample_app

#作成したアプリのディレクトリに移動
$ cd sample_app

#サーバーを起動
$ rails s
```
ブラウザで[localhost:3000](http://localhost:3000/)を開き、以下の画面が表示されたら成功。
![スクリーンショット 2023-03-09 13.14.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3071346/248f88dd-59b0-a3cd-ce1a-e06299006ed2.png)


## 参考サイト
・[【Rails】 Ruby on Railsの環境構築の全手順と概念をわかりやすく解説](https://pikawaka.com/rails/curriculums-wakatter-mac-env-rails6)
・[「PATH を通す」の意味をできるだけわかりやすく説明する試み](https://qiita.com/sta/items/63e1048025d1830d12fd)
・[Shimの意味](https://qiita.com/ironsand/items/4f0342f5914a9ae99b0e)
・[rbenv rehashをちゃんと理解する](https://mogulla3.tech/articles/2020-12-29-01/)
・[webpackとは？](https://qiita.com/minato-naka/items/0db285f4a3ba5adb6498)
・[Node.jsとはなにか？なぜみんな使っているのか？](https://qiita.com/non_cal/items/a8fee0b7ad96e67713eb)