こんにちは、Shinyaです
今回はRuby on Railsを勉強していくうえで必ず必要になるBundlerの使い方について見ていきます
Bundlerとは
bundlerとはgemの依存関係とバージョンを管理するためのgemです
gem同士の依存関係に応じて問題が起きないようにgemをインストールしたり、プロジェクトごとに使うgemとそのバージョンを分けたりできます
Bundlerのインストール
gem install bundler
gem install bundler
でもインストールできますが、Bundlerのバージョンを指定するときは以下のように-v [バージョン]
とオプションで指定します
>gem install bundler -v x.y.z
gem list bundler
インストールされてるBundlerのバージョンを全て表示できます
>gem list bundler
ちなみに、bundler
の部分は別のgemでも機能します
gem list
というコマンドはインストール済のgemのバージョンを調べるものだからです
主なbundleコマンド
bundle -v (--version)
使っているBundlerのバージョンが分かります
>bundle -v
Bundler version 2.1.4
Bundlerのバージョンでエラーが出ることがあるので、その時は要確認です
よくあるBundlerバージョンが原因のエラーはこれです
"You must use Bundler 2 or greater with this lockfile."
後述のGemfile.lockでは使用するBundlerのバージョンが指定されています
この指定バージョンとプロジェクトで使っているBundlerのバージョンが異なるときこのエラーが出ます(指定Ver.=2で使用Ver.<2のとき)
リモートリポジトリから人が作ったプロジェクトをクローンしてきたときなど良く起こります
bundle install
gemをインストールするために使います
初めてインストールするとき、gemはGemfileで指定しておきます
インストール後にインストールしたgemを記載したGemfile.lockを作成して、以降Gemfile.lockを参照するようになります
Gemfile.lockに記載されておらず、Gemfileに記載されてるgemがある場合、そのgemと依存関係のあるgemをまるっとインストールしてくれます
なので新たにgemを追加でインストールしたいときはGemfileに記載してbundle install
すれば良いです
gemのインストール先ですが、オプションを何もつけないとシステム(使ってるPC)にgemがインストールされます
システム以外にインストール先を指定する際は以下のようにします
>bundle install --path [インストール先のパス]
インストール先のパスとしてはvendor/bundle
とするのが一般的です
vendor/bundle
とするとRailsプロジェクト内のvendorフォルダ内のbundleフォルダ以下にgemがインストールされます
プロジェクトごとにインストール先を変えれば、プロジェクトごとに使うgemのバージョンを変えられることになるので、環境に起因する問題を起きづらくできます
インストール先に関連する話として、githubやbitbucketへプロジェクトをpushするとき注意することがあります
それはvendor/bundleにインストールしたgem群もろともpushしない方が良いということです
何故かというとまずpushに時間がかかりますし、Gemfileで管理しているのでgitで追跡する意味がないですし、共同開発しているときはリモートリポジトリのgemが自分のローカルリポジトリのgemで乱されてしまうというデメリットがあるからです
なのでbundle install
する前に.gitignoreに/vendor/bundle
と記述しておいてpushされないようにしましょう
ちなみにgemのインストール先は.bundleフォルダのconfigに記録されており、一度指定したら以降自動的にそこにインストールされるようになります
bundle update
bundle install
ではGemfile.lockを参照するので、勝手にgemのバージョンが上がることはないです
一方、bundle update
ではGemfileに記載されたgemのバージョンを最新にしてしまいます
その後、Gemfile.lockを上書きします
これによりバージョン違いが起こり思わぬエラーが発生することがあるので慎重に使う必要があります
bundle exec [コマンド]
>bundle exec [コマンド]
railsのコマンドを実行する際にbundle exec
を付けるとプロジェクトのGemfile.lockで指定されたバージョンでgemを作動させることができます
bundle exec
を付けない場合、システムにインストールされたgemが指定されたことになります
複数のプロジェクトで異なるバージョンのgemを使う際など、使うコマンドです
GemfileとGemfile.lock
内容が一部重複しますが今一度まとめます
Gemfileの作成方法:bundle init
Gemfileの役割:bundle install
でインストールするgemとそのバージョンを記載
書かれているgemはbundle update
で最新版にアップデートされる
Gemfile.lockの記載内容:bundle install
でインストールされたgemとそのバージョンが記載されるbundle update
したgemのバージョンが上書きされる
使用してるRubyとBundlerのバージョンが記載される
Gemfile.lockの役割:bundle install
する際に合わせにいくバージョンとして参照する
→結果的にバージョンをロックできるので、Gemfile.lockを管理すれば環境に起因するエラーを防げる
最後に
以上がBundlerについてでした
僕が今まで調べる必要があった内容を網羅的に紹介しました
Ruby on Railsを使っていくうえで欠かせない知識なので、ぜひお役立てください
それでは、また
参考資料
https://qiita.com/patorash/items/751a1837c49c63a38288
https://bundler.io/
https://qiita.com/lasershow/items/1a048d03ddaaba98171e
https://www.sejuku.net/blog/19426
https://qiita.com/YumaInaura/items/64e5721549e4927ce85f