Bundler入門:Gemfile・bundle install・bundle execの使い方まとめ

スポンサーリンク

Bundler入門:Gemfile・bundle install・bundle execの使い方まとめ

はじめに

RubyやRailsのプロジェクトでgemを管理するとき、bundle installbundle 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/railsbin/rake などがあらかじめ用意されています。


bundle update

gemを新しいバージョンに更新します。

# 全部更新(注意が必要)
bundle update

# 特定のgemだけ更新
bundle update rails
bundle update rubocop rubocop-rails

bundle updateGemfile.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時の自動実行まで」を参照してください。