Rails初心者が知っておきたい基礎知識｜gem、Bundler など…

>この記事では、《Rails初心者が知っておきたい基礎知識》について、
業務を通して学習した内容をまとめています。

- __gem とは…？__
- __Gemfile とは…？__
- __Gemfile.lock とは…？__
- __Bundler とは…？__

こういった疑問についてまとめています。

__※本記事は、自分で学習したことのまとめ用として書いています。
尚、解説で誤った点があれば、スローして頂ければ喜んでキャッチしますのでお願い致します。__

##gem とは…？
![books-918521_1920.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/255884/458eeefe-3527-31b9-c0d0-41b4d1ec2c52.jpeg)


__『gem』__は・・・

Rubyのライブラリ（パッケージともいいます）です。
>__『ライブラリ』__とは…
プログラムの部品で、__便利な機能をひとまとめにしたもの__です。

>ライブラリを利用することで、__自分で１からコードを書くことなく機能を実装することができるので、効率的に開発することが可能__です。

Rubyのgemには便利なものがたくさんあり、例えば…

- __Rails（Webフレームワーク）__
- __Devise（ログイン機能）__
- __Kaminari（ページネーション）__
- __unicorn（アプリケーションサーバ）__
- __Active Admin（管理画面）__

などがあります。
gemを使うことでログイン機能やページネーションといった機能も、簡単に実装可能です。

##Gemfile とは…？

__『Gemfile』__は・・・

gemをインストールするための『設計書』のようなもので、基本的にこの`Gemfile`に自分のアプリケーションに必要なgemを記述します。

##Gemfile.lock とは…？

__『Gemfile.lock』__は・・・

gemをインストールした後の『ログ、記録』のようなもので、インストールしたgemの一覧とバージョンが記載されています。

###【比較】Gemfile と Gemfile.lock の違い

|  | Gemfile | Gemfile.lock |
|:-:|:-:|:-:|
|__更新方法__|手動|自動|
|__更新タイミング__|コマンド実行前|コマンド実行後|
|__内容__|インストールするgem|インストールしたgem|

### 【余談】なぜ Gemfile.lock が必要なのか…？
![school-1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/255884/f14e1989-edc9-8954-28be-dc293f07132d.jpeg)


gemは、インストールした時期によってバージョンが変わってしまう可能性があるため…
例えば、__本番環境と開発環境でインストールされるgemのバージョンが異なってしまう可能性__があります。

しかし・・・

`Gemfile.lock`が使用するgemのバージョンを管理してくれるため、__仮にgemがアップデートされても、使用するgemのバージョンは変更させないということが可能__になります。

ちなみに・・・

`Gemfile.lock`を更新したい時は、`bundle update`を使います。

##Bundler とは…？

__『Bundler』__は・・・

gemを管理するためのgemで、Bundlerを使用することで…

~~~
bundle install
~~~

~~~
bundle update
~~~

などのコマンドが使用できるようになります。

gem同士は関連し合っていることが多いので、実際は`Gemfile`に書いてあるgemの他にも、gemが必要になります。

そこで・・・

`Bundler`は、それらも自動でインストールし、`Gemfile.lock`に記述してくれます。

![bundle_movement.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/255884/1a461aff-8c3c-9708-f0f2-1a13958d5066.png)

`Bundler`は、__特定のRailsアプリケーションに必要なgemパッケージをリストアップし、複数のコンピュータ間で簡単に同期が取れるようにするもの__です。

例えば・・・

上記の図のように開発者Bさんが、開発者AさんからRailsアプリのソースコードを受け取ったとします。

この時、__Bさんは`bundle install`を実行するだけで、必要なgemをインストールすることができ、簡単に環境を構築できます。__

###【一覧】 よく使う Bundlerコマンド のオプション

| コマンド | 概要 |
|:-:|:-:|
|__bundle init__|Gemfileを生成|
|__bundle install__|Gemfileに記述したgemをインストール|
|__bundle update__|インストール済みのgemのバージョンを更新|
|__bundle list__|インストール済みのgemを一覧表示する|
|__bundle exec__|Bundlerでインストールしたgemを使用して、<br>コマンドを実行|

###【コマンド】&ensp;bundle install とは…？

~~~
bundle install
~~~

上記を実行すると・・・

Railsは、`Gemfile.lock`を元にgemのインストールを行います。

この時…

__『`Gemfile.lock`に記述されていなくて、且つ`Gemfile`に記述されているgem』__

がある場合、__『該当するgem』と『該当するgemに関連するgem』をインストールした後、`Gemfile.lock`を更新__します。

反対に、__`Gemfile.lock`に記述されていれば・・・__

__そこに記述されたgemを見て、それがGemfileの内容に矛盾していない限り、`Gemfile.lock`の内容に従いインストール__します。

###【コマンド】&ensp;bundle update とは…？

~~~
bundle update
~~~

上記を実行すると・・・

Bundlerは、`Gemfile`を元にgemのインストールを行い、その後`Gemfile.lock`を更新します。

###【余談】上記２つのコマンドの使い分けを少し解説
![camera-coffee-composition-1509428.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/255884/12938bae-d88e-34c6-90c0-a84609d7c1e7.jpeg)


`bundle update`は・・・

その言葉通り、gemのバージョンを更新する時に使用します。

なぜなら・・・

`bundle install`コマンドでは、条件に矛盾が生じない限り`Gemfile.lock`に存在するgemに関しては、更新作業を行わないからです。

__*※`bundle update`は、本番環境で安易に実行しないように注意しましょう。場合によっては、gemのバージョンにズレが発生し、クラッシュする可能性があります。*__

ですので・・・

`bundle update`は、必ずローカル環境で実行してください。

また、`bundle install`に関しては・・・

__`Gemfile`に新しくgemを記述した際に使用__します。