Railsでポートフォリオ制作②【環境構築】

Web系企業でのバックエンドエンジニアとしての就職を目指して、ポートフォリオを制作しています。
ポートフォリオ制作のすべての記録を残していきます。

## この記事は
Rails環境構築でエラーに出合いまくり七転八倒した私が、どうにか`rails new`までこぎつけた軌跡を記しています。
エラー解消のためにひとつひとつの操作・コマンドを理解しようと、それぞれ意味を調べて書いています。
Railsでこれから環境構築する方の参考になれば幸いです！

## マシンスペック
- macOS Monterey
- MacBook Pro (13-inch, 2020, Four Thunderbolt 3 ports)
- Intel Core i7
- メモリ 32GB

## Ruby, Railのバージョン
- Ruby: 3.1.2
- Rails: 7.0.4
### どうやってRuby, Railsのバージョンを決める？
- 基本最新のものを使うべき
    - 理由：古いものだと脆弱性があったりセキュリティ的に問題がある可能性があるから
- メジャーバージョンが上がってすぐのタイミングなどでは安易に手は出さない方が良い
    - 理由①：バグが潜んでる可能性があるから
    - 理由②：周辺ライブラリ(gemなど）が対応していないことがあるから
    - 理由③：ドキュメントがネット上に少ないから

## 環境構築の手順
1. Command Line Toolsのインストール
1. Homebrewのインストール
1. rbenvのインストール
1. Rubyのインストール
1. RubyGemsのアップデート
1. Bundlerのインストール
1. Railsのインストール
1. Node.jsのインストール
1. データベースの用意
1. Railsアプリケーションの新規作成!

### なぜ上記のような準備が必要？ そもそも何者？
- __Command Line Tools__： Macに標準搭載されていないコマンド（Homebrewの`brew`コマンドなど）を使えるようになるツール。
- __Homebrew__： Macに標準搭載されていないソフト（rbenvなど）をインストールできるパッケージマネージャ。
- __rbenv__: Rubyのバージョン管理ツール。
- __RubyGems__: Rubyのインストール時に同梱される、Rubyのライブラリ（=gem）の管理ツール。
- __Bundler__: gemのバージョン管理ツール。
- __Node.js__: Javascriptランタイム（＝JSの実行に必要な全てが詰まっているもの）。フロントエンドでJSを用いる場合、RailsのアセットパイプラインでJSの圧縮を行うにはJSランタイムが必須。
- __データベース__: Railsアプリケーションのデータの永続化のために必要。今回はMySQLを利用。

それでは、各ステップについて詳しく書いていきます！
余談の欄は、インストールがうまくいかなかったり途中でエラーが出た時などに見てください。

## 1. Command Line Toolsのインストール
```bash
$ xcode-select --install
```
上記のコードを実行するとポップアップが出てきます。
成功したら __2. Homebrewのインストール__ へ！

### （余談： 私の場合）
私はもともとCommand Line Toolsが入っていたのですが、CLTを最新版にアップデートしようと思い以下のコード（現存のものを削除）を実行してから上記のコードでインストールを行いました。

```bash
$ sudo rm -rf /Library/Developer/CommandLineTools
```

## 2. Homebrewのインストール
[Homebrewの公式サイト](https://brew.sh/index_ja)から、インストール用のコマンドをコピペして以下のように実行すればOK。
```bash
$ /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
```
以下のコマンドでインストールが無事にできているか確認。バージョンが表示されれば成功。 __3. rbenvのインストール__ へ！

```bash
$ brew --version
```

### （余談： 私の場合）
Homebrewのアップデート（`brew update`）がエラー吐きまくり状態に陥ったので、一旦アンインストールしてインストールし直しました。アンインストールコマンドは以下です。(`install.sh`->`uninstall.sh`に書き換えたもの)
OSのバージョンによってコマンドが異なる＆Homebrewでこれまでインストールしたパッケージも削除されるので注意。
```bash
$  /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/uninstall.sh)"
```
アンインストール後のインストール時のエラーは、[こちらの方法](https://stackoverflow.com/questions/39836190/homebrew-install-failed-during-git-fetch-origin-masterrefs-remotes-origin-mas)（＝中途半端に残ったファイルの削除）で解決しました。

## 3. rbenvのインストール
anyenvを使って、rbenvのインストールを行います。
anyenvの説明・インストール方法は[こちら](https://www.to-r.net/media/anyenv/)がとても分かりやすいです。
anyenvを使うことで、rbenv, nodenvでいちいちパスを通したり、initコマンドの実行を設定する手間が省けます🎉

1\) ~ 3) の順に、コマンドを実行していきます。
rbenvのバージョンが表示されるのを確認できたら、__4. Rubyのインストール__ へ！
```bash
# 1) rbenvのインストール
$ anyenv install rbenv

# 2) シェルを再起動
$ exec $SHELL -l

# 3) rbenvのインストール確認。rbenvのバージョンが表示されたらOK。
$ rbenv -v
```
## 4. Rubyのインストール
1\) ~ 4) の順に、コマンドを実行していきます。
rubyのバージョンが表示されるのを確認できたら、__5. RubyGemsのアップデート__ へ！
```bash
# 1) Rubyの最新バージョン確認
$ rbenv install -l

# 2) インストールしたいバージョンを指定してインストール
$ rbenv install <version>

# 3) 指定したバージョンをグローバルに適用
$ rbenv global <version>

# 4) シェルの再起動
$ exec $SHELL -l

# 5) 指定したバージョンが適用されているか確認
$ ruby -v
```

## 5. RubyGemsのアップデート
RubyGemsはRubyに同梱されますが、同梱バージョンよりも新しいバージョンが公開されていることも。確実に新しいバージョンが使えるようにアップデートしておきましょう。
```bash
$ gem update --system
```

## 6. Bundlerのインストール
gemのバージョン管理ツールのインストール。
※Bundlerのインストールの前に、今後のgemのインストール時間の短縮のために、ローカルでのドキュメント生成機能をoffにしておきます。
```bash
# .gemrcというgemのconfigファイルに、ドキュメント生成機能の停止を設定
$ echo "gem: --no-document" > ~/.gemrc

# Bundlerのインストール
$ gem install bundler
```

## 7. Railsのインストール
バージョンを指定して、Railsをインストールします。バージョンを指定しない場合、最新のバージョンがインストールされます。
```bash
$ gem install rails -v <version>
```
:::note 
疑問点：
新たにRubyのバージョンやgemをインストールした時には、毎回`rbenv rehash`をした方がい![スクリーンショット 2022-11-10 10.04.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2669070/d366ea52-dcc6-5f48-b724-eee04516b7a7.png)
いらしい？（[参照](https://www.digitalocean.com/community/tutorials/how-to-install-ruby-on-rails-with-rbenv-on-macos#step-4-installing-rails)）
→ rbenvのGitHubでは基本的に自動でrehash行われるからコマンド打つ必要ないとのこと。（[参照](https://github.com/rbenv/rbenv#rbenv-rehash)）ruby, gemコマンドがうまく動かなかった時にrehashすればよさそう。
rbenv rehash: shimsディレクトリを作成。shims=入力されたrubyコマンドを、現在使用されているrubyバージョンのファイルにリダイレクトする役割。（[詳細](https://medium.com/@Sudhagar/rbenv-how-it-works-e5a0e4fa6e76#:~:text=rbenv%2Dshim%20gets%20created%20during,that%20you%20can%20rehash%20again.)）
:::

## 8. Node.jsのインストール
anyenvを使って、nodenvというNode.jsのバージョン管理ツールのインストールから行います。
anyenvのインストール方法は[こちら](https://www.to-r.net/media/anyenv/)。
```bash
# 1) nodenv(=Node.jsのバージョン管理ツール)のインストール。
$ anyenv install nodenv

# 2) シェルを再起動
$ exec $SHELL -l

# 3) nodenvのインストール確認。バージョンが表示されたらOK。
$ nodenv -v

# 4) Node.jsのインストール可能なバージョン一覧を表示
$ nodenv install -l

# 5) Node.jsのインストール
$ nodenv install <version>

# 6) Node.jsのインストール確認。バージョンが表示されたらOK。
$ nodenv versions
```

## 9. データベースの用意
MySQLのインストールを行います。
MySQLは起動したままで。Railsサーバの立ち上げ時にMySQLが動いている必要があるためです。
MySQLの停止は`sudo mysql.server stop`でOK。
```bash
$ brew install mysql

# インストールの完了を確認
$ mysql --version

# MySQLの起動
$ sudo mysql.server start
```

## 10. Railsアプリケーションの新規作成
```bash
# MySQLを使用したRailsアプリを新規作成
$ rails new <app_name> -d mysql

$ cd <app_name>

# データベース新規作成（MySQL起動した状態で）
$ bin/rails db:create

# Railsサーバの起動
$ bin/rails s
```
http://localhost:3000/ に接続して、このような画面が表示されたら成功！！
![スクリーンショット 2022-11-10 10.04.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2669070/260e54fa-974f-ee8d-c74a-2bb97e1af38c.png)

:::note 
`bin/rails`コマンドについて:
 `bundle exec rails`として実行した時と同様に、Gemfileどおいrのgemを利用できる環境上でrailsコマンドを実行できる。プラス、SpringというRailsの起動を効率的に行う機能も組み込まれる。このように、よく使うコマンドを包み込んで使いやすくするスクリプトを「binstub」と呼ぶ。
:::

最後に、アプリで使うruby, Node.jsのバージョンを固定しておきましょう。
（今回は ruby: 3.1.2, Node.js: 19.0.1のバージョンに固定しています。）
```bash
$ rbenv local 3.1.2
# -> 「3.1.2」と書かれた.ruby-versionファイルが作成される

$ nodenv local 19.0.1
# -> 「19.0.1」と書かれた.node-versionファイルが作成される

# バージョンが固定されているか確認
$ ruby -v
$ node -v
```

以上です！
お疲れ様でした！

## 参考
- [現場で使える Ruby on Rails 5速習実践ガイド](https://www.amazon.co.jp/%E7%8F%BE%E5%A0%B4%E3%81%A7%E4%BD%BF%E3%81%88%E3%82%8B-Ruby-Rails-5%E9%80%9F%E7%BF%92%E5%AE%9F%E8%B7%B5%E3%82%AC%E3%82%A4%E3%83%89-%E5%A4%A7%E5%A0%B4%E5%AF%A7%E5%AD%90/dp/4839962227)
- [【初心者向け】MacでRailsを使えるようにするための環境構築方法を徹底解説！](https://himakuro.com/rails-setup-for-beginner)
- [【完全版】MacでRails環境構築する手順の全て](https://qiita.com/kodai_0122/items/56168eaec28eb7b1b93b)
- [How to update Xcode from command line](https://stackoverflow.com/questions/34617452/how-to-update-xcode-from-command-line)
- [How to Uninstall Homebrew from Mac OS](https://osxdaily.com/2018/08/12/how-uninstall-homebrew-mac/)
- [rbenv GitHub](https://github.com/rbenv/rbenv)
- [ruby-build GitHub](https://github.com/rbenv/ruby-build)
- [How To Install Ruby on Rails with rbenv on macOS](https://www.digitalocean.com/community/tutorials/how-to-install-ruby-on-rails-with-rbenv-on-macos)
- [nodenv GitHub](https://github.com/nodenv/nodenv)