エンジニア転職日記

エンジニア転職に向けての日記です

gemやbundlerについてまとめ

概要

gemをインストールする際に使うbundle install の意味や、gemってそもそもなんだっけ?という話をまとめていきます。

背景

プログラミングスクールのカリキュラムを進める中で、rubocop というコード解析のgemをインストールしました。(rubocopについてはこちらのQiitaがわかりやすいですhttps://qiita.com/tomohiii/items/1a17018b5a48b8284a8b)。

カリキュラム上では、アプリケーションディレクトリ直下に.rubocop.ymlという設定ファイルが生成されるはずだったのですが、なぜかvendorディレクトリの中でいくつも生成されていました。

結果的にはbundle install する際にvendor/bundleというオプションがついていた、という話なのですが、自分の中でbundlerについての知識があいまいだと感じたため、再度gemやbundlerについてまとめ直してみました。

gem

gemは、rubyのライブラリです。ライブラリとは、プログラムのパッケージのようなものです。例えば、deviseというgemをインストールすれば、コントローラーやビューファイルに1からコードを書かなくてもログイン機能を実装できます。しかし、それぞれのgemはお互いに依存関係にあり、gemAがないとgemBが使えない、ということもあります。そこで力を発揮するのがbundlerです。

bundler

bundlerは、Gemfileに書いてあるgemを一括でインストールし、その後も依存関係を壊すことなく管理してくれます。gemのバージョンに関しても指定ができるので、gemをアップデートしたとしても依存関係を崩すことなく保管できます。また、他のPCやサーバーでアプリケーションを稼働させたい時もbundlerをインストールすれば、開発したPCと同じgemの構成になるので環境に左右されずに稼働させることができます。

vendor/bundle

vendor/bundleオプションは、アプリケーションごとにbundlerをインストールするオプションです。通常のbundle installをすると、

/Users/[ユーザー名]/.rbenv/versions/[rubyのバージョン]/lib/ruby/gems/[rubyのバージョン名]/gems

に保存されます。つまり、PCのシステム内部にgemがインストールされ、それをbundlerが依存関係を壊さないように管理しているイメージです。一方で、vendor/bundleオプションをつけると

/Users/[ユーザー名]/[アプリケーション名]/vendor/bundle/...以下略

に保存されます。つまり、今開発しているアプリケーションのディレクトリにbundlerの情報が保存されることになります。

オプションをつける場合は、gemのインストール時に

bundle install --path vendor/bundle

と入力します。一度入力すると、次回以降もvendor/bundleでインストールされます。

解除したい場合は

sudo vim .bundle/config

と入力し、bundlerの設定が表示されるので、その中の

BUNDLE_PATH: "vendor/bundle"

の行を削除してください。

ちなみにvendor/bundleを使うか使わないかというのは意見が別れるそうで、それに関しては伊藤淳一さんの記事(https://qiita.com/jnchito/items/99b1dbea1767a5095d85)が参考になったので載せておきます。

参考

https://qiita.com/jnchito/items/99b1dbea1767a5095d85

https://pikawaka.com/rails/bundler

https://qiita.com/tomohiii/items/1a17018b5a48b8284a8b

https://techtechmedia.com/vender-bundle-solution/