初めてのローカル環境構築（MacでHomebrewを経由しRailsを導入する）

# はじめに

railsチュートリアルを１周した後に、オリジナルアプリ作成のためにローカル環境を構築しました。
チュートリアル学習時は、cloud9を使用していた為、初めての作業でした。

初学者のため、必須ではないコマンドが含まれているかもしれませんが、どうかご了承ください。
なかなか苦戦しながら環境設定をしたので、同じ境遇の方に少しでも参考になると幸いです。
もし、修正箇所がございましたら、ぜひ、お知らせください。

# 目標

下記作業までの完了を目標としています。

* 内容
    * railsに新規アプリ作成
    * MySQLの設定および導入
    * Git・GitHubの設定
    * herokuサーバにアプリをデプロイ



# 前提

* PC仕様
    * OS：macOS(Catalina)
* 使用シェル
    * zsh

* 使用技術
    * バックエンド：ruby（バージョン：2.7.3）
    * フレームワーク：rails（バージョン：6.1.3.2）
    * データベース：MySQL（バージョン：8.0.25）
    * インフラ：heroku



# 1.homebrewの導入

はじめに、ターミナル（私の場合はVScodeのターミナル）に入力します。
上手くいけば、homebrewが使用可能になります。

```zsh:ターミナル(zsh)

% /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"

```
homebrewはAppleで提供してないツールをインストールする時に使う便利なソフトのようです。
詳しくは、下記URLを参考にしてください。
[■Homebrew公式ページ](https://brew.sh/index_ja.html)
<br>
念のため、homebrewがインストールできているか確認します。

```zsh:ターミナル(zsh)

% brew -v

〜〜実行結果〜〜
Homebrew ＜バージョン＞
```

ここで、homebrewのバージョンが表示されれば、インストールされています。


# 2.Ruby,Railsのインストール

まず、homebrew経由で必要なgem一式をインストールします。
（もしかすると不要かも：ここはrailsチュートリアルを参考にしました）

```zsh:ターミナル(zsh)

% brew install libtool libxslt libksba openssl libyaml

```

rubyのバージョン管理ツール`rbenv`と`ruby-build`をインストールします。
これでrubyを土台にしてRubyGemを使って、railsが構成できる準備が整います。

```zzsh:ターミナル(zsh)

% brew install rbenv ruby-build

```

**■ Rubyインストール**

まず、インストール可能なrubyバージョンを確認します。

```zsh:ターミナル(zsh)

% rbenv install --list-all

```


上記で確認したバージョンの中から指定したいバージョンを選択し、rubyをインストール&コンパイルします。

```zsh:ターミナル(zsh)

% rbenv install ＜バージョン＞

```

インストール出来ているrubyバージョンを確認します。

```zsh:ターミナル(zsh)

% rbenv versions

```

もしインストール済みのrubyで不要なものがあれば
削除しておきましょう。

```zsh:ターミナル

% rbenv uninstall バージョン

```

ここで、ターミナルで使用しているシェルを調べておきます。

```zsh:ターミナル(zsh)

% echo $SHELL

〜〜実行結果〜〜
/bin/zsh
```
私の場合、上記通り、zshが動作しているようでした。


先程に調べたシェルに対して、rbenv初期化コードを書き込みます。
（おそらく、MacOSがCatalinaの方は、zshかと思います）

```zsh:ターミナル(zsh)

% echo 'eval "$(rbenv init -)"' >> ~/.zshrc

```


初期化した内容をすぐに反映させます。
（ターミナルを再起動しても同じ動作となるはずです。）

```zsh:ターミナル(zsh)

% source ~/.zshrc

```

土台となるrubyをバージョン指定します。
（globalは全範囲で使われる設定で、localとするとディレクトリ毎で制御できるようです。）
※railsインストールする前に行います。

```zsh:ターミナル(zsh)

% rbenv global ＜バージョン＞

```

一度、rubyがインストールできているか確認します。

```zsh:ターミナル(zsh)

% ruby -v

```

**■ Railsインストール**
railsのバージョンを指定して、インストールします。
（RubyGemsをもって、railsをインストールしている）

```zsh:ターミナル(zsh)

% gem install rails -v ＜バージョン＞

```

なお、インストール済みのrailsで不要なバージョンが存在する場合は
削除しておきましょう。

```zsh:ターミナル
# インストール済みのrailsバージョンを全て確認する
% gem search ^rails$ -l

*** LOCAL GEMS ***

rails (6.1.4, 6.1.3.2, 5.1.7)

# 不要なバージョンを削除する
% gem uninstall rails -v '5.1.7' 
% gem uninstall railties -v '5.1.7'

```

ちゃんと、railsがインストールできているか確認します。

```zsh:ターミナル(zsh)

% rails -v

```

これで、rubyとrailsがインストールできました！良かった良かった！




# 3.MySQLのインストールから設定まで

続いて、データベースの設定していきます。
まず、homebrewを使ってmysqlをインストールします。

```zsh:ターミナル(zsh)

% brew install mysql

```

mysqlがインストールできたか確認します。

```zsh:ターミナル(zsh)

% brew info mysql

```

さっそく、mysqlサーバーを起動させてみます。
（停止する時はstartではなくstopをコマンドとします。）

```zsh:ターミナル(zsh)

% mysql.server start

```

root権限でログインします。
現状はパスワード無しで、ログイン可能です。

```zsh:ターミナル(zsh)

% mysql -u root

```

ログインできた所で、セキュリティ設定を行います。
（mysqlにログインするとプロンプトが`mysql>`に変わります。）

```sql:ターミナル(MySQL)

mysql> mysql_secure_installation

```

上記コマンドを行うと、下記質問をMySQLから聞かれるので、それぞれ回答していきます。
（基本は全てy(YES)の回答で良いのかなと。）

* 質問内容
    * パスワードの設定を行うか　　　　　　　　　　　　　　　　　→ 回答：y
    * パスワードの強度はどうするか　　　　　　　　　　　　　　　→ 回答：0 ~ 2
      (Low:0, Medium:1, Strong:2)
    * 登録パスワードは入力してください　　　　　　　　　　　　　→ 設定するパスワードを入力
    * 入力されたパスワードで設定して良いか　　　　　　　　　　　→ 回答：y
    * 匿名ユーザーを削除するか　　　　　　　　　　　　　　　　　→ 回答：y
    * リモートサーバーからrootユーザーへのアクセスを遮断するか　→ 回答：y
    * テスト用のデータベースを削除するか　　　　　　　　　　　　→ 回答：y
    * （最後）入力内容をすぐに反映するか　　　　　　　　　　　　→ 回答：y


<br>

上記が設定できたら、パスワードが設定できているか確認のため
exitコマンドでMySQLから脱出します。

```sql:ターミナル(MySQL)

mysql> exit

```


先ほどのMySQLへのログインコマンドに、-pオプション(password)を付けると
PASSWORDがプロンプト表示されますので、設定したパスワードを入力します。


```zsh:ターミナル(zsh)

% mysql -u root -p

Enter password: ここに設定したパスワードを入力する
　　　　　　　　　（セキュリティ上、表示はされません）

```

すると、再度rootユーザーでログインできるかと思います。
先程とは異なりパスワードありで、rootユーザーでログインできる様になりました。

ただし、管理権限をもつrootユーザーで常時ログインして
作業する事は望ましくないので、新規ユーザーを作成しておいた方が良いでしょう。
(当記事では触れませんが、下記記事が分かりやすく解説してくれています。)

**`参考:　データベースを使用するユーザーを作成する方法`**

MySQLの新規ユーザー設定は、下記記事を参考にさせて頂きました。
@reeenapi さん、ありがとうございました。
[**■RailsのDBを(初めから| |後から)MySQLに変更する**](https://qiita.com/reeenapi/items/9fc38c4f2f8186c78288)


# 4.Railsアプリ作成

railsアプリケーションを作成する前に、念のため、
homebrewでインストールされたものを一覧で確認しておきます。

```zsh:ターミナル(zsh)

% brew list

```


開発する作業ディレクトリ（environment）を作成して、そこに移動します。

```zsh:ターミナル(zsh)

# environmentディレクトリを作成
% mkdir environment

# 作成したenvironmentディレクトリに移動
% cd environment

```

railsのバージョンを指定して、アプリケーションを作成します。

**※オプション**
`--skip-test`：minitestを使用しない場合のオプション
`-d mysql`：MySQLをデータベースとして設定

```zsh:ターミナル(zsh)

# ＜バージョン＞は6.1.3など設定したいバージョンを記述
# ＜アプリケーション名＞は何でもOK
% rails _＜バージョン＞_ new ＜アプリケーション名＞ -d mysql --skip-test

```


作成できたアプリケーションのディレクトリに移動します。

```zsh:ターミナル(zsh)

% cd ＜アプリ名＞

```

rails newコマンドでアプリを生成すると、命名したアプリ名のディレクトリ直下に
gemfileとdatabase.ymlが自動で修正されます。

はじめに、Gemfileのdatabase欄にあるgemが「sqlite（デフォルト）」ではなく
「mysql2」となっていることを確認します。

```gemfile:Gemfile
〜省略〜

# Use mysql as the database for Active Record
gem 'mysql2', '~> 0.5'

〜省略〜
```

次にconfig/database.ymlで、usernameとpasswordが空白になっているので
さきほどMySQLで設定したものを記入していきます。

```yml:config/database.yml
default: &default
  adapter: mysql2
  encoding: utf8mb4
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
  username: ＜設定したユーザー名＞
  password: ＜設定したパスワード＞
  socket: /tmp/mysql.sock

development:
  <<: *default
  database: アプリ名_development

test:
  <<: *default
  database: アプリ名_test

production:
  <<: *default
  database: アプリ名_production
  username: アプリ名
  password: <%= ENV['アプリ名_DATABASE_PASSWORD'] %>

```

ここで、railsコマンドでデータベースを作成しておきます。

```zsh:ターミナル(zsh)

% rails db:create

```

これでMySQLの世界で新しいデータベースが作成されているはずです。

下記コマンドでmysqlにログインして確かめてみましょう。

```zsh:ターミナル(zsh)

% mysql -u ＜ユーザー名＞ -p

Enter password: 

```

作成されているデータベースの一覧を出します。

```sql:ターミナル(MySQL)

mysql> show databases;

+-------------------------+
| Database                |
+-------------------------+
| アプリ名_development     |
| アプリ名_test            |
| ~以下省略~               |
+-------------------------+
● rows in set (0.00 sec)

```

先ほど、config/database.ymlで設定した名称で
・アプリ名_development(開発用)と
・アプリ名_test(テスト用)
の２つのデータベースが作成されていると思います。

これでMySQLのインストールと設定が完了しました！


# 番外：railsを使いやすくする

rubyのコード解析ツールとして、rubocopというgemがあります。

rubocop導入には、下記記事が参考にさせて頂きました。

@d0ne1s さん、ありがとうございました。
[**■VSCodeでRubocopを使う**]
(https://qiita.com/d0ne1s/items/a3566aca023d11f2bfc4)





# 5.Git/GitHubの設定

ここからは、変更履歴を残すGit/GitHubの設定をしていきます。

**`1.Git`**
Gitがインストールされているか、念のため、確認します。
（Macでは標準で搭載されていたはずです）

```zsh:ターミナル(zsh)

% git --version

```

まず、Gitの設定をします。

```zsh:ターミナル(zsh)

# 名前
% git config --global user.name "名前"

# メールアドレス
% git config --global user.email Eメールアドレス

# (任意)Gitのパスワードを1日（86,400秒）保持する設定
% git config --global credential.helper "cache --timeout=86400"

```

一旦、Gitの設定状況を確認します。

```zsh:ターミナル(zsh)

% git config -l

```

railsアプリケーションのディレクトリに移動しておきます。

```zsh:ターミナル(zsh)

% cd ＜アプリ名＞

```

このディレクトリで、Gitの初期化を行います。
（.gitファイルが生成されて以降の変更記録が残っていきます。）

```zsh:ターミナル(zsh)

% git init

```

.gitファイルが存在することを、念のため、確認します。
(ls:現ディレクトリ内のファイル一覧を表示, -a:隠しファイルも含める)

```zsh:ターミナル(zsh)

% ls -a

.git　. . . . . . . . 
↑ 隠しファイルが表示される　

```

gitの現況を確認します。
（未add・未commitの状態を把握）

```zsh:ターミナル(zsh)

% git status

```

新規作成および変更を加えた全ファイルをgitのステージングエリアへ追加します。

```zsh:ターミナル(zsh)

% git add .

```

ステージングエリアの変更分に問題がなければ、コミットします。
（-mでメッセージ付ける）

```zsh:ターミナル(zsh)

% git commit -m "メッセージ"

```

これまでのcommit履歴を表示します。
（オプションの--onelineは１行表示）

```zsh:ターミナル(zsh)

% git log --oneline

```

<br>

**`2.GitHub`**

[**■GitHub公式ページ（まず、こちらでリポジトリを作成する）**](https://github.co.jp)
上記URLからリポジトリを作成後、GitHubと現在のGitのリポジトリを紐付けます。


```zsh:ターミナル(zsh)

% git remote add origin https://github.com/GitHubアカウント名/アプリ名.git

```

Git commitで変更したファイルをGitHubへpushします。

```zsh:ターミナル(zsh)

% git push origin master

```

これで、Git/GitHubの設定が完了です！





# 6.Herokuの設定からデプロイまで

herokuに関しては、下記記事の一部を実行しています。
@murakami-mm さん、ありがとうございました。
[**■Herokuへのデプロイ方法【Heroku+Rails+MySQL】**]
(https://qiita.com/murakami-mm/items/9587e21fc0ed57c803d0)


まず、herokuのインストールします。
[**■heroku公式ページ(参考)**](https://devcenter.heroku.com/articles/heroku-cli#other-installation-methods)

```zsh:ターミナル(zsh)

% brew tap heroku/brew && brew install heroku

```

いつものように、herokuがインストールできているかの確認します。

```zsh:ターミナル(zsh)

% heroku -v

```

インストールできていれば、herokuサーバにアプリケーションを作成します。

```zsh:ターミナル(zsh)

% heroku apps:create アプリ名

```

作成したアプリに、MySQLベースのClearDBというデータベースを適用させます。
無料ですが、容量が５MBです。詳細は下記にあります。
[**■heroku（ClearDB概要）**](https://elements.heroku.com/addons/cleardb)

```zsh:ターミナル(zsh)

% heroku addons:create cleardb:ignite

```

次は、設定のためにClearDBのURLを確認します。

```zsh:ターミナル(zsh)

% heroku config

〜〜実行結果〜〜

=== アプリ名 Config Vars
CLEARDB_DATABASE_URL: mysql://<ユーザー名>:<パスワード>@<ホスト名>/<データベース名>?reconnect=true
```

そして、上記で取得したURLを参考にして、各種設定をしていきます。

```zsh:ターミナル(zsh)

% heroku config:add DB_NAME='<データベース名>'
% heroku config:add DB_USERNAME='<ユーザー名>'
% heroku config:add DB_PASSWORD='<パスワード>'
% heroku config:add DB_HOSTNAME='<ホスト名>'
% heroku config:add DB_PORT='3306'
% heroku config:add DATABASE_URL='mysql2://<ユーザー名>:<パスワード>@<ホスト名>/<データベース名>?reconnect=true'

```

再度、設定確認のコマンドを打って、ちゃんと設定できているか確認します。

```zsh:ターミナル(zsh)

% heroku config

```

最後に、ローカルリポジトリの内容をherokuへpushします。

```zsh:ターミナル(zsh)

% git push heroku master

```

git push Heroku masterコマンドを打つと、返答メッセージの文末あたりに
自分が作ったWEBアプリのURLが参照されます。

そのURLをクリックして、本番環境（heroku）でアプリが起動できているか確認してみてください！！





#終わりに

Qiita記事を中心に情報収集しながら、はじめて環境構築をした内容をまとめました。
現在、railsで新規アプリを実装していますが、毎日エラーと戦ってます。笑
今後は、学習内容のアウトプットのために、投稿記事を増やせればと思っています。
拙い文章でしたが、最後までお読みいただき、ありがとうございました！！！！！

それでは、また。