41
31

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 5 years have passed since last update.

bundle install --path vendor/bundleと、bundle listとgem listの違いについて

Posted at

動機

今日とある方(エンジニア歴約1ヶ月)とメンタリングをしていて、bundle install --path vendor/bundleがなんのためにあるのかとか、bundle listgem listはどう違うのかなどが話題に上ったのでまとめようと思いました。

背景知識

最低限、bundlerを自身で使ったことがある方を想定して書かれています。

本編

bundle install --path vendor/bundleについて

結論

結論を先に言うと、--pathオプションをつけるのは開発時においては必要ありませんが、異なるバージョンのgemが混ざるのが嫌な人はつけましょう。

目的

--pathオプションをつける目的としては、プロジェクト下のディレクトリ(例えばvendor/bundle)にgemをインストールすることで、グローバルにインストールされたgemとbundlerが管理するgemを分離することが挙げられます。他にも、ctagsなどを利用する際にgemがプロジェクト下にインストールされていると便利である可能性があります。

背景

このvendor/bundleですが、由来は--deploymentオプションにあるようです。
https://bundler.io/v2.0/man/bundle-install.1.html#DEPLOYMENT-MODE に記載されているように、bundle install --deploymentでインストールを実行した場合、--pathの指定がないならvendor/bundleにgemがインストールされます。
これを開発環境で模倣するのが先述の--path vendor/bundleの由来ということになりそうです。

問題点

bundle install --path vendor bundleは利点もありますが欠点もあります。
特に重大なのは、同じようなアプリケーション(特にRailsアプリケーション)を何個も並行して開発する場合に、同一のgemを各アプリケーション下に重複してインストールすることになってしまい、ディスク容量を圧迫する恐れがあるという点です。
bundle installのみでインストールを行う場合、グローバルにgemがインストールされ、以後はそちらのgemを単に参照するだけになるため、ディスク容量の面では効率的になります。

bundle listgem listの違いについて

bundle list

bundle listコマンドは、「あるプロジェクトがbundlerによって管理されている場合に、そこで使用されているgemを一覧表示するコマンド」です。
ここで重要なのは、bundle installコマンドにどんなオプションを渡していても、ここで表示される内容は変わらないということです。
もちろん、そもそもbundlerを使っていない場合はこのコマンドは単にエラーになります。言い換えると、どのプロジェクトにいるか(ワーキングディレクトリがどこか)によって結果が変わります。

gem list

gem listコマンドは、「グローバルにインストールされたgemを一覧表示するコマンド」です。
このコマンドはグローバルなコマンドなので、ワーキングディレクトリがどこであろうと結果は同じです。一方、bundle install --path vendor/bundleなどでインストールされたgemについては表示されません。

両コマンドの違いと使い分け

違いは上に書いた通りですが、使い分けとしては、基本的にRailsアプリケーションの開発においてはbundle listコマンドを使用することが多いと思われます。
一方、例えばtmuxinatorやforemanのようなコマンド利用が主目的のgemをインストールしているケースにおいてはgem listを使うことも多いでしょう。これは単純にgemが今の環境にインストールかどうかを調べる一つの有力な方法がgem list | grep 'GEM_NAME'であるということによります。

Rubyのバージョンについての余談

上に書いてある「グローバル」という単語は厳密には「あるRubyのバージョンについて」という但し書きが必要になります。
現代のRuby開発環境においては、rbenvchrubyを使って複数のRubyをインストールするのは珍しくありません。この場合、使用するRubyのバージョンをスイッチするとインストールされているgemについても変更されます。換言すると、gem listの結果はRubyのバージョンによって異なる可能性があります(bundle listの結果については、どのRubyバージョンであってもbundle installを実行してさえいれば結果は同じになります)。
また、現状複数のRubyに同じgemを同時にインストールする方法は特に用意されていないと思われます。一応、rbenv-default-gemsというものはありますが、事前に決められたものしかインストールできないので融通性に欠けます。

さらに余談

rubygemsとbundlerは(かなり先の話になりますが)統合される計画もあるという話を聞きました。興味深いですね!

終わりに

今回書いた内容に間違いがありましたら編集リクエストを送ってください!

41
31
0

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
41
31

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?