Railsアプリケーションの環境構築周りのまとめ

Railsの案件に携わって最初めちゃ苦しんだ。
まとめておいて後から振り替えれるようにしておく。

# 1. 各パッケージ管理ソフトの概要
パッケージ管理ソフト|概要
---|---
rbenv|複数のRubyバージョンを管理するツール。バージョンを指定してrubyをインストールできる。インストール後は各バージョンごとに利用するgem置き場が提供される。Railsアプリケーションごとに使用するRubyバージョンを指定できるようになる。
RubyGems|Rubyライブラリのgemのパッケージ管理ツール。現在利用しているバージョンのrubyに対してgemをインストールできる。rubyをインストールすると付属してくるツール。目的のgemをインストールする時に別のgemが必要になる(=依存関係がある)場合、それもインストールして目的のGemを使える状態にすることができる。
Bundler|RubyGemsをより高機能に使うgem。RailsプロジェクトごとにGemfileというファイルで使用するgemを明示的に管理できる(PC全体を汚さず、Railsプロジェクトで完結する)。こいつ自体がRubyGemsによってインストールされるgemであるが、RubyGemsを操って各Railsアプリケーションに必要なgemをGemfile, Gemfile.lockというgem一覧ファイルに基づいてインストールできる。<br>RubyGemsの説明を見てるとそれで十分じゃね？と思うかもしれないが、Gemfile.lockが一番重要な機能。例えばgem「A」をインストールする場合にgem「B」が必要だったとする。そんなgem「A」をRubyGemsでインストールしたとする。このときgem「B」もインストールされる。ここまではよい。しかし時が流れてなにかの拍子にgem「B」のバージョンを上げたとする。このとき、gem「A」を利用するには実はgem「B」の特定のバージョンが必要であり、互換性がなくなってしまった場合、gem「A」は使えなくなってしまう。gem「B」のどのバージョンが必要なのかももうわからなくなってしまう。**Bundlerを使ってgemをインストールして使用する場合は、Gemfile.lockに具体的にどんなgemをどんなバージョンでインストールしたのかが細かく記録されるため、この問題へ対処できる**のだ。また、複数人で開発するときに対象のRailsアプリケーションが使用するgemの一覧をバージョン含めて共有する時にも役に立つ。


## 補足
**rbenv**

- 関係するディレクトリ
    
```
# rbenv周り
~/.rbenv/
  versions/
    X.X.X/      # Ruby(Ver X.X.X)の各種ファイルを管理するディレクトリ
      bin/      # 当該Rubyバージョンの標準ライブラリ、RubyGems経由でインストールしたコマンドの実行ファイル
      include/        
      lib/      # 標準ライブラリ、RubyGems経由でインストールしたライブラリ     
      openssl/
      share/    # マニュアル類
  shims/
    <各コマンドの実行ファイル>
  version       # PC全体で使うruby環境のバージョン番号が書かれている


# Railsプロジェクト周り
<Railsプロジェクト用ディレクトリ>/
  .ruby-version # このRailsプロジェクトで使うRuby環境のバージョン番号が書かれている(優先順位は version < .ruby-version)
```





# 2. 関係図
言葉だけだと見返した時に意味わかんなくなりそうなので、イメージ図を貼っておく。

![30672.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59542/ac37f1ce-5e2a-7d4d-61cf-2a61f2c0cdce.jpeg)



# 3. よく使うであろうコマンド
## 3.0. rbenvのインストール・設定
```
# rbenv自体のインストール
brew install rbenv

# rbenvにパスを通す
## .bash_profileオープン(zsh使ってるなら.zshrc)
vi ~/.bash_profile

## 以下書き込んで保存
export PATH="$HOME/.rbenv/bin:$PATH"
eval "$(rbenv init -)"

## 設定を即反映
source ~/.bash_profile

## パスが通っていることを確認
which ruby
=>/Users/<自身のユーザー名>/.rbenv/shims/ruby
になってればOK

```

## 3.1. rbenv
コマンド|説明
---|---
rbenv install --list|インストール可能なRubyのバージョンを表示。無印のバージョンが最も高くてdevとかついてないやつが最新の安定版みたい。
rbenv install <バージョン>|バージョン指定してRubyをインストール
rbenv rehash|インストールしたRubyへパスを通す(**新しくバージョン指定してインストールした場合に必須で必要になる。rbenv install とセット**)
rbenv versions|インストール済みのrubyのバージョンを表示する。*がついてるやつがカレントディレクトリで使用しているRubyのバージョン。後述のruby -vの結果と同じ。
rbenv global <バージョン>|特段の指定がない場合に本マシンで使用するRubyのバージョンを設定
rbenv local <バージョン>|カレントディレクトリ配下で使用するRubyのバージョンを指定。このコマンドを実行するとカレントディレクトリに.ruby-versionというファイルができ、開くと<バージョン>が記載されている。**後述のGemfileではRailsアプリケーションが使うRubyバージョンは指定できない(Bundler自体が現在使っているRubyを親とするため)ため、なかなか重要なファイルである**


## 3.2. RubyGems
基本的にgemはBundlerを使ってアプリケーションごとにインストール、管理するため、RubyGemsのコマンドを使用することは少ない。

コマンド|説明
---|---
gem install bundler|現在使用しているバージョンのRubyへBundlerをインストールする。
``gem list -ra <gem名>``|イントール可能なgemのバージョンを確認。<gem名>には正規表現も使えるため、例えばrailsならば^rails$とすると表示がすっきりする
gem update --system|RubyGems自体のバージョンをあげる。
``gem uninstall <gem名>``|gemをアンインストールする

## 3.3. Bundler
コマンド|説明
---|---
bundle install|1. Gemfile.lockを確認してgemをインストール。<br>2. Gemfileを確認してGemfile.lockに存在しないgemをインストールし、Gemfile.lockに追記・更新。<br>
bundle update <特定のgem名>|Gemfile.lockを無視してGemfileに書いてある条件に基づいて特定のgemをインストール。一部のgemをアップデートしたいときに影響範囲を小さく抑えるために使用する。<特定のgem名>を省略してしまうと、Gemfile.lockの内容をすべて無視して、イチからGemfileに基づいてgemをインストールし直してしまうため、これまで動いていたRailsアプリケーションが動かなくなった、ということが起きうる。**基本的に使っちゃダメなコマンド。**
bundle exec <各種コマンド>|Gemfile.lockに書いてあるバージョンのgemを使用して<各種コマンド>を実行。bundle execがないと意図せぬバージョンのgemが使われたりして大変なことになる。**railsアプリケーションを操作するときには絶対にbundle execをつけるべき。**