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