本記事の趣旨
初学者の方でもわかりやすいように、5分で読めるくらいの軽さで下記の項目についてまとめます!
- bundlerとは何か?
- プロジェクト(アプリ)毎にgemを管理する根拠
- bundlerを使ってプロジェクト毎にgemを管理する方法
- プロジェクト毎にGemを管理するときはgitignoreしよう
※ OSはmacを想定しています。
※ rbenvを使用していることを想定しています。
bundlerとは何か?
ざっくり言うと、Gemfileに書いているGemをよしなに管理してくれる超便利マンです。
各種のGemを人の手で管理すると、非常にだるい、だるすぎるので、bundlerさんの力を借りて簡単に管理するのが定石となります。
下記の記事でわかりやすくまとめてくれているので、詳しく知りたい方は参照してください。
https://pikawaka.com/rails/bundler
プロジェクト毎にgemを管理する根拠(メリット)
上記の通り、Gemをよしなに管理してくれるbundlerさんですが、デフォルトではinstallすると、rbenv配下でGemを管理することになります。
参考: https://qiita.com/chro96/items/35f67767d0b511939fea
実は、デフォルトのrbenv配下にプロジェクトのGemをインストールするのはあまり良くないんですね…
rbenv配下でプロジェクトのGemを管理すると何が悪いか
プロジェクトで使うGemをrbenv配下にインストールしていくと、どんどんrbenv配下が汚くなります。
例えば、一つのプロジェクトが終わったことを仮定します。
そのプロジェクトのソースコードを削除したとしても、インストールしたGemはrbenv配下に下記のように残り続けるわけです。
~/.rbenv/versions/2.7.2/lib/ruby/gems/2.7.0/gems/faker-2.20.0
その後、そのプロジェクトで使ったGemを使うとも限らないですし、他のプロジェクトにアサインした時にfaker-2.19.0を使うことになったとしたら、Gemのバージョンが競合を起こしてしまいます。
そうなると、いちいちプロジェクト毎にGemを消したり、Gemのバージョンを直したりする必要が出てしまうんですよね。
だから、プロジェクト毎にGemを管理するのが楽なんです。
bundlerを使ってプロジェクト毎にgemを管理する方法
めちゃくちゃ簡単です。
下記の通りbundleのconfigにパスを設定してからbundle install
をしてあげることで、プロジェクト(アプリ)毎にGemを管理することができます。
※ みなさんのプロジェクト配下(ここではsample_appとします)で実行してください。
sample_app $ bundle config set --local path vendor/bundle
または
sample_app $ bundle config set path 'vendor/bundle'
次にbundle install
sample_app $ bundle install
このコマンドを実行してあげると、下記のようにプロジェクトのディレクトリ配下にvendor/bundle
というディレクトリが追加されて、そこにGemがインストールされます。
sample_app $ ls -la vendor/bundle/ruby/2.7.0/gems
total 0
drwxr-xr-x 67 {ユーザーネーム} staff 2144 8 16 11:53 .
drwxr-xr-x 9 {ユーザーネーム} staff 288 8 16 11:53 ..
drwxr-xr-x 7 {ユーザーネーム} staff 224 8 16 11:52 actioncable-6.0.4
drwxr-xr-x 9 {ユーザーネーム} staff 288 8 16 11:52 actionmailbox-6.0.4
drwxr-xr-x 6 {ユーザーネーム} staff 192 8 16 11:52 actionmailer-6.0.4
drwxr-xr-x 6 {ユーザーネーム} staff 192 8 16 11:52 actionpack-6.0.4
drwxr-xr-x 9 {ユーザーネーム} staff 288 8 16 11:52 actiontext-6.0.4
...
※ 上記のbundleのconfig設定方法はコメントでご指摘いただいて修正いたしました。(ご指摘いただき、本当にありがとうございます!)
以前は、下記の方法で定義してましたが、非推奨になったようです。
sample_app $ bundle install --path vendor/bundle
参考記事: https://qiita.com/devzooiiooz/items/8babd82f780f01812f9d
※ なぜvendor/bundle
なのか?この問いについては、僕も答えを知りません。以前慣習と聞いた覚えがあって、それで納得したので放置しています。(詳しい方がいたら教えてください)
プロジェクト毎にGemを管理するときはgitignoreしよう
上記の通り、プロジェクト毎にGemを管理できるようになりましたが、このままだとgitにGemが全部ブッ込まれてしまいます。
これは実務でやるとある種のテロ活動となるため、必ず.gitignore
に下記の定義を記載して、vendor配下を無視するようにしましょう!
【.gitignore】
(前略)
# Ignore vendor
/vendor/*
!/vendor/.keep
まとめ
ここまで、使用するGemをプロジェクト毎にvendor/bundle
ディレクトリで管理する方法についてまとめました。
要は、みなさんのプロジェクト配下で下記のコマンド叩くんだぜ!ってことになります。
sample_app $ bundle install --path vendor/bundle
rbenv配下でプロジェクトのGemを管理して泣きを見た方が散見されたので、本記事がそのような方の一助となれれば幸いです。