Bundler入門:Gemfile・bundle install・bundle execの使い方まとめ
はじめに
RubyやRailsのプロジェクトでgemを管理するとき、bundle install や bundle exec を使うことになります。何となく使っているけど仕組みがよくわからない、という方向けにBundlerの基本をまとめます。
Bundlerとは
BundlerはRubyのgemのバージョンを管理するツールです。プロジェクトごとに使うgemとそのバージョンを固定し、環境の違いによる「手元では動くのに本番で動かない」問題を防ぎます。
Ruby 2.6以降はBundlerが標準添付されています。
bundle -v # Bundler version 2.5.x
Gemfile
Gemfile はプロジェクトが使うgemを宣言するファイルです。プロジェクトルートに置きます。
# Gemfile source 'https://rubygems.org' ruby '3.3.0' gem 'rails', '~> 7.2' gem 'pg' gem 'puma' group :development, :test do gem 'rspec-rails' gem 'factory_bot_rails' end group :development do gem 'rubocop', require: false gem 'rubocop-rails', require: false end
バージョン指定の書き方
| 記法 | 意味 |
|---|---|
gem 'rails', '7.2.0' |
7.2.0 のみ |
gem 'rails', '~> 7.2' |
7.x の最新(7.2以上8未満) |
gem 'rails', '~> 7.2.0' |
7.2.x の最新(7.2.0以上7.3未満) |
gem 'rails', '>= 7.0' |
7.0以上 |
gem 'rails' |
最新版 |
~> はよく使うので覚えておくと便利です。「メジャーバージョンを固定しつつパッチバージョンは追う」場合は ~> 7.2.0、「メジャーバージョンを固定しつつマイナーバージョンも追う」場合は ~> 7.2 を使います。
groupの使い分け
| group | 読み込まれる環境 |
|---|---|
| なし(全体) | すべての環境 |
:development |
開発環境のみ |
:test |
テスト環境のみ |
:development, :test |
開発・テスト環境 |
:production |
本番環境のみ |
bundle install
Gemfileに書いたgemをインストールします。
bundle install
初回実行後に Gemfile.lock が生成されます。2回目以降は Gemfile.lock に書かれたバージョンを優先してインストールします。
Gemfile.lock
Gemfile.lock はインストールされたgemの正確なバージョンを記録したファイルです。
GEM
remote: https://rubygems.org/
specs:
rails (7.2.1)
activejob (= 7.2.1)
...
Gemfile.lock をgitにコミットすることで、チーム全員・CI・本番環境で同じバージョンのgemが使われることを保証します。必ずコミットしてください。
インストール先を指定する
vendor/bundle にインストールする場合(CI環境などでキャッシュしやすくなる):
bundle install --path vendor/bundle
bundle exec
bundle exec はGemfileで管理されたgemのバージョンでコマンドを実行します。
bundle exec rails server bundle exec rspec bundle exec rubocop
bundle exec を付けないと、グローバルにインストールされたgemが使われる場合があり、バージョンの違いで予期しない動作が起きることがあります。Railsプロジェクトでは常に bundle exec を付けるのが基本です。
binstub(省略形)
bundle binstubs でプロジェクトの bin/ ディレクトリに実行ファイルを生成できます。
bundle binstubs rspec-core
生成後は bundle exec rspec の代わりに bin/rspec で実行できます。Railsプロジェクトでは bin/rails、bin/rake などがあらかじめ用意されています。
bundle update
gemを新しいバージョンに更新します。
# 全部更新(注意が必要) bundle update # 特定のgemだけ更新 bundle update rails bundle update rubocop rubocop-rails
bundle update は Gemfile.lock を更新します。依存関係が変わることがあるため、実行後はテストで動作確認してください。
よく使うコマンド一覧
# Gemfileに書いたgemをインストール bundle install # 特定のgemだけ更新 bundle update <gem名> # インストール済みgemの一覧 bundle list # gemの情報を表示 bundle info rails # Gemfileに書いたgemでコマンドを実行 bundle exec <コマンド> # binstubを生成 bundle binstubs <gem名> # 使われていないgemを確認 bundle clean --dry-run # Bundlerのバージョン確認 bundle -v
まとめ
Gemfileでgemとバージョンを宣言し、bundle installでインストールするGemfile.lockはチームで共有するために必ずgitにコミットするbundle execを付けてコマンドを実行することでバージョンが固定されるbundle update <gem名>で特定のgemだけ更新できる
タスクの自動化には「Rake入門:Rakefileの書き方からRailsでのカスタムタスク作成まで」を参照してください。
bundle / rake / rails コマンドの早見表は「Rails開発コマンド早見表:bundle / rake / rails の使い分けまとめ」を参照してください。
コードスタイルの自動チェックは「RuboCop導入入門:インストールから設定・git commit時の自動実行まで」を参照してください。