bundle execとは?Railsで必要な理由と使い方を初心者向けに解説

rails icon
Ruby on Rails

こんにちは、とまだです。

みなさん、Railsを勉強していて「bundle exec」というコマンドを見て戸惑ったことはありませんか?

「なんでわざわざ長いコマンドを打つの?」

「bundle execってそもそも何?」

そんな疑問を持つのは当然です。

今回は現役のエンジニア、そして元プログラミングスクール講師としての経験から、bundle execについて解説します。

この記事を読めば、bundle execの仕組みと必要性が理解できます。

そして、Rails開発でのトラブルを避けられるようになります。

bundle execとは?図書館で例えてみる

bundle execを理解するには、まず図書館を想像してみてください。

あなたが「Ruby入門」という本を読みたいとします。

でも図書館には違う版の「Ruby入門」が3冊あります。

  • 2020年版
  • 2022年版
  • 2024年版

どれを読むべきでしょうか?

実は、あなたのプロジェクトには「2022年版を使う」と決まっています。

でも、うっかり最新の2024年版を手に取ってしまうかもしれません。

すると、書いてある内容が微妙に違って混乱します。

bundle execは「必ず指定された版を使う」ための仕組みです。

つまり、図書館の司書さんが「このプロジェクトは2022年版ですよ」と教えてくれるイメージです。

なぜbundle execが必要なのか

Railsプロジェクトでは、たくさんのGem(ライブラリ)を使います。

これらのGemにはバージョンがあります。

たとえば、Railsにも6.0、6.1、7.0などのバージョンがあります。

複数のプロジェクトを扱っていると、問題が起きます。

プロジェクトAではRails 6.0を使い、プロジェクトBではRails 7.0を使う。

こんな状況はよくあります。

もし、bundle execを使わないとどうなるでしょう?

システムにインストールされた最新版が勝手に使われます。

Rails 6.0で動くはずのプロジェクトが、Rails 7.0で動いてエラーになる。

これは本当によく起こるトラブルです。

Gemfileという設計図の役割

Railsプロジェクトには必ずGemfileというファイルがあります。

これは「このプロジェクトで使うGemのリスト」です。

まるで料理のレシピのようなものです。

# Gemfileの例
gem 'rails', '~> 6.1.0'
gem 'pg', '~> 1.1'
gem 'puma', '~> 5.0'

このレシピには材料(Gem)とその分量(バージョン)が書かれています。

そして、bundle installを実行すると、Gemfile.lockというファイルができます。

これは「実際に使う材料の詳細な記録」です。

bundle execは、この記録通りのGemを使うことを保証してくれます。

よく使うbundle execコマンド

実際の開発でよく使うコマンドを見てみましょう。

Railsサーバーの起動

bundle exec rails server

プロジェクトで指定したRailsのバージョンでサーバーが起動します。

データベースのマイグレーション

bundle exec rails db:migrate

データベースの構造を変更する重要な作業です。

バージョン違いは致命的なエラーにつながります。

テストの実行

bundle exec rspec

テストツールも正しいバージョンで動かす必要があります。

bundle execを使わないとどうなる?

実際に起こりやすいトラブルを紹介します。

ケース1:メソッドが見つからない

新しいバージョンで追加されたメソッドを使っていると、古いバージョンでエラーになります。

逆に、古いバージョンで削除されたメソッドを使っているとエラーになります。

ケース2:挙動が変わる

同じメソッドでも、バージョンによって動作が変わることがあります。

開発環境では動いたのに、本番環境で動かない。

そんな悲劇が起こります。

ケース3:依存関係の衝突

GemAがGemBの特定バージョンを要求することがあります。

この依存関係が崩れると、予期せぬエラーが発生します。

bundle execを楽に使うコツ

毎回「bundle exec」と打つのは面倒ですよね。

そこで、エイリアス(省略形)を設定する方法があります。

bashやzshの設定

# ~/.bashrcや~/.zshrcに追加
alias be="bundle exec"

これでbe rails serverと短く書けます。

よく使うコマンドだけエイリアス化

alias bers="bundle exec rails server"
alias berdb="bundle exec rails db:migrate"

自分がよく使うコマンドだけ登録するのも良い方法です。

開発チームでの重要性

一人で開発している時は、あまり問題を感じないかもしれません。

でも、チーム開発では話が変わります。

メンバー全員が同じ環境で開発する必要があります。

Aさんの環境では動くのに、Bさんの環境では動かない。

こんな状況は開発の進行を大きく妨げます。

bundle execを使えば、全員が同じバージョンのGemを使います。

これにより、「私の環境では動くのに...」という問題を防げます。

本番環境でのbundle exec

開発環境だけでなく、本番環境でも重要です。

デプロイツールの多くは、自動的にbundle execを使います。

たとえば、Capistranoというツールでは以下のように実行されます。

bundle exec puma -C config/puma.rb

これにより、本番環境でも確実に指定バージョンで動作します。

トラブルシューティング

bundle exec関連でよくある問題と解決法を紹介します。

Gemが見つからない

エラーメッセージに「could not find gem」と出る場合があります。

まず、以下を確認しましょう。

bundle install

これでGemfileに書かれたGemがインストールされます。

バージョンが合わない

「gem version conflict」などのエラーが出ることがあります。

Gemfile.lockを削除して、再度bundle installすると解決することがあります。

rm Gemfile.lock
bundle install

ただし、チーム開発では慎重に行ってください。

Rubyのバージョン違い

rbenvやrvmを使っている場合、Rubyのバージョンも確認が必要です。

ruby -v

プロジェクトで指定されたRubyバージョンと一致しているか確認しましょう。

まとめ

bundle execは、Gemのバージョンを固定するための重要な仕組みです。

図書館で例えると、「必ず指定された版の本を使う」ための仕組みでした。

最初は面倒に感じるかもしれません。

でも、この習慣が大きなトラブルを防いでくれます。

特に以下の場面では必ず使いましょう。

  • Railsサーバーの起動
  • データベースの操作
  • テストの実行
  • 本番環境へのデプロイ

エイリアスを設定すれば、入力の手間も減らせます。

Rails開発を続けていく上で、bundle execは欠かせない相棒になります。

ぜひ今日から意識して使ってみてください。

共有:

著者について

とまだ

とまだ

フルスタックエンジニア

Learning Next の創設者。Ruby on Rails と React を中心に、プログラミング教育に情熱を注いでいます。初心者が楽しく学べる環境作りを目指しています。

著者の詳細を見る →