6
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

【Rails】bundlerでプロジェクト毎にgemを管理する根拠と方法(5分)

Last updated at Posted at 2022-08-16

本記事の趣旨

初学者の方でもわかりやすいように、5分で読めるくらいの軽さで下記の項目についてまとめます!

  1. bundlerとは何か?
  2. プロジェクト(アプリ)毎にgemを管理する根拠
  3. bundlerを使ってプロジェクト毎にgemを管理する方法
  4. プロジェクト毎に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を管理して泣きを見た方が散見されたので、本記事がそのような方の一助となれれば幸いです。

6
2
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?