【超初心者向け】RubyonRailsの共同開発のスタートで詰まったポイント(bundlerとrubyのバージョン設定に関して)

# はじめに
Ruby on Railsの共同開発に参加したところ、作業に取り掛かる前段階で、独りでローカルで開発するときとは違うエラーが出たので、解決までの一連の流れまとめました。（注：実務ではありません）
具体的にはリモートリポジトリをクローンして`$ bundle exec rails g controller`を実行するところまでの解説になります。

# ローカルの開発環境
mac OS Catalina
Rails バージョン：5.2.4.1
Ruby バージョン：2.6.3

# 共同開発プロジェクトの環境
Rails バージョン：5.2.4.1
Ruby バージョン：2.6.5

# エラー発生から解決まで

### bundlerに関するエラー発生

共同開発者のgithubからproject(仮名)リポジトリをローカルへクローン。僕の場合デスクトップへ

```terminal
$ git clone "リモートリポジトリprojectのurl"
```

作業用ブランチを作成し、移動後以下のコマンドで第一エラー発生

```terminal
$ rails g controller users
```
エラー内容

```terminal
You must use Bundler 2 or greater with this lockfile. (Bundler::LockfileError)
```

### エラー原因の同定（bundlerのバージョン）

Bundlerのバージョンに問題があるようなので、以下のコマンドでbundlerのバージョンを調べると

```terminal
$ bundle -v
```

またもやエラー発生。**Gemfile.lock**で要求されている**'bundler' (2.1.4)**がないことが原因と教えてくれている。

```terminal
Could not find 'bundler' (2.1.4) required by your /Users/hoge/Desktop/project/Gemfile.lock. (Gem::GemNotFoundException)
To update to the latest version installed on your system, run `bundle update --bundler`.
To install the missing version, run `gem install bundler:2.1.4`
```

では自分はどのバージョンなら持っているのか？それすら分からない。
ググってみると、インストールされているbundlerのバージョンを以下のコマンドで確認できるらしい。
https://qiita.com/YumaInaura/items/64e5721549e4927ce85f

```terminal
$ gem list bundler

*** LOCAL GEMS ***

bundler (1.17.3, default: 1.17.2)
```

結果を見てみると、1.17.3と1.17.2は持っているようだ。
確かに2.1.4はない。

ここで二つの選択肢が生まれた。
1. Gemfile.lockで指定されているbundlerのバージョンを下げる
2. ローカルのbundlerのバージョンを上げる

共同開発Gの経験あるリーダーに訊いてみると、**共同開発全体に影響が出てしまうのでローカルで対応すべし**とのこと。よって選択肢2に進む。

### エラー解決へのアクション（bundlerインストール）

特定のバージョンのgemをインストールするためには以下のコマンドが使える。バージョン2.1.4を指定してインストールした。`You don't have write permissions`と怒られたので、馬鹿の一つ覚えで`sudo`を頭につけてみるとパスワードを要求されたが、入力するとインストールが始まり10秒で終わった。
https://qiita.com/YumaInaura/items/64e5721549e4927ce85f

```terminal
$ gem install bundler -v x.y.z(バージョン)
```
↑これは怒られた。
↓これでクリア

```terminal
$ sudo gem install bundler -v x.y.z(バージョン)
```
```terminal
Password:
Fetching bundler-2.1.4.gem
Successfully installed bundler-2.1.4
Parsing documentation for bundler-2.1.4
Installing ri documentation for bundler-2.1.4
Done installing documentation for bundler after 2 seconds
1 gem installed
```

再度インストール状態を確認すると、やったー、バージョン2.1.4がインストールされている！

```terminal
$ gem list bundler

*** LOCAL GEMS ***

bundler (2.1.4, 1.17.3, default: 1.17.2)
```

では、現在のbundlerバージョンはどれになっているのだろう？調べてみると、、

```terminal
$ bundle -v
Bundler version 2.1.4
```

お、なぜかは分からないが、2.1.4が設定されている。ちなみにバージョン指定は`bundle _x.y.z_ install`で、できる。
ということは今なら**Gemfile.lock**の要求条件（bundlerバージョン2.1.4）を満たせているのだろうか？いざ参る！！

### rubyバージョンに関するエラー発生

```terminal
$ rails g controller users

...
何十行ものエラー文
...

Your Ruby version is 2.6.3, but your Gemfile specified 2.6.5 (Bundler::RubyVersionMismatch)
```

はい、ここで一句。一難去ってまた一難。エラーの先にはまだ見ぬエラー。
しかし、これは分かりやすいぞ。今度はRubyのバージョンを合わせれば良いのだな。

### エラー解決へのアクション（rbenvでrubyバージョン管理）

rubyのバージョンは**rbenv**で管理できるはず。rbenvのインストールなどに関してはProgateで詳解あり（閲覧するには有料会員になる必要有りかもです）。
https://prog-8.com/docs/ruby-env

rubyのバージョン指定する流れはざっくりいうと
1. homebrewインストール
2. homebrewでrbenvインストール
3. rbenvで好きなrubyバージョンをインストール
4. rbenvでバージョン指定
となる。

僕は2まで終わっていたので、ruby2.6.5をrbenvでインストールすれば良いはず。
以下のコマンドで実行

```terminal
$ rbenv install 2.6.5
```
時間が結構かかるが、無事インストール完了。

インストールされたrubyバージョンを確認するとこんな感じ。（2.5.0は以前インストールしていた）

```terminal
$ rbenv versions
* system
  2.5.0
  2.6.5
```

`rbenv global x.y.z`などを用いてrubyバージョンの切り替えに成功。ここら辺理解が浅いので先輩方の参考記事をご覧ください。切り替えが上手くいかない原因はパスの設定によることが多いようです。
https://qiita.com/opiyo_taku/items/3312a75d5916f6cd32b1
https://qiita.com/akatsuki174/items/c0384b9903b4b5cbbdaf

```terminal
$ ruby -v 
ruby 2.6.5p114 (2019-10-01 revision 67812) [x86_64-darwin19]
```

### gem欠落に関するエラー発生から解決まで

よし今度こそ行くぞ、ということで`$ rails g controller users`を実行するもエラー発生。

```terminal
$ bundle exec rails g controller users
Could not find rake-13.0.1 in any of the sources
Run `bundle install` to install missing gems.
```

rakeに関するgemがないことが分かった。指示に従い、辛抱強く`bundle install --path vendor/bundle`を実行
`--path vendor/bundle`はインストールをプロジェクト内のフォルダ（vendor/bundle）に対して行うよう指定するもの。

インストールが終わり、もう一度挑戦する。

```terminal
$ bundle exec rails g controller users
Running via Spring preloader in process 64840
      create  app/controllers/users_controller.rb
      invoke  erb
      create    app/views/users
      invoke  helper
      create    app/helpers/users_helper.rb
      invoke  assets
      invoke    js
      create      app/assets/javascripts/users.js
      invoke    scss
      create      app/assets/stylesheets/users.scss
```

やったー。コントローラーが作れたぞー！
コントローラーを作るだけならコマンドはいらないが、おそらく`rails g model`とか`rails s`で結局同様につまづくと思われる。