Bundlerを使って複数の環境で同じバージョンのGemを使用する

Rails ではアプリケーションで必要となる Gem パッケージの管理に Bundler を使用します。 Bundler の設定ファイルである Gemfile 、インストールを行った結果を保存する Gemfile.lock を使うことで複数の環境で別れて同じアプリケーションを開発する場合でも、簡単に同じ開発環境を整えることができます。ここでは Bundler を使って複数の環境で同じバージョンの Gem を使用する方法について解説します。

(Last modified: )

Gemパッケージとは

まずは Gem パッケージについて簡単に解説します。

Ruby で使われるライブラリやアプリケーションは、 Gem と呼ばれる形式のパッケージにすることができます。多くのライブラリが Gem 形式でパッケージされ公開されており、これらは RubyGems と呼ばれるパッケージ管理ツールを使ってダウンロードしたりインストールすることができます。これらのパッケージのことを単に Gem や Gem パッケージなどと呼びます。

Rails も Gem 形式でパッケージ化されたものであり、 Rails をインストールするときも「gem install rails」と RubyGems を使ってインストールを行います。

Rails で作成したアプリケーションは、通常 Rails だけでなく他の多くの Gem パッケージも利用します。例えば、 SQLite を Rails から利用するために必要な sqlite3 パッケージもその一つです。

Bundlerとは

Rails のアプリケーション開発を複数のメンバーで行う場合、プログラムファイルだけでなく、すべてのメンバーが対象のアプリケーションで使用している Gem パッケージをインストールしておかなければなりません。また、各 Gem パッケージのバージョンも揃える必要があります。

そこで使われるのが Bundler です。 Bundler は Rails アプリケーションに必要な Gem パッケージの種類やバージョンを管理し、複数のメンバーが統一して同じ Gem パッケージをインストールするためのツールです。

Gemfileとは

Gemfile は、プロジェクトに必要な Gem の一覧とそのバージョンの条件を記述したファイルです。 Bundler はこの Gemfile を元に、プロジェクトに必要な Gem をまとめてインストールします。

Gemfile では、 Gem の名前やバージョンを指定するほか、開発環境やテスト環境、本番環境など特定の環境でのみ使用する Gem を指定することもできます。

Bundlerを使ったGemパッケージのインストール

それでは Bundler の使い方を確認していきます。「rails new アプリケーション名」を使って Rails アプリケーションを作成すると、必要なファイルを作成した後で「bundle install」が実行されていました。

Bundlerを使ったGemパッケージのインストール(1)

この「bundle install」が Bundler を使って必要な Gem パッケージをインストールしている部分となります。

このように Rails アプリケーションを新規に作成すると、(1)必要なファイルの作成、(2)必要な Gem パッケージが記載された Gemfile の作成、(3)Gemfile に基づいて Bundler による Gem パッケージのインストール、(4)他の環境で使用するための Gemfile.lock の作成、といったことが行われています。

では動作を確認するために「bundle install」を手動で行なってみます。 Rails アプリケーションを作成する時、「--skip-bundle」またな「-B」を付けて実行すると「bundle install」を自動的に実行しません。今回テストとして次のようにアプリケーションを作成しました。

rails new diary -B -G

Bundlerを使ったGemパッケージのインストール(2)

※ 「-G」オプションについては「Railsアプリケーションを作成する」を参照されてください。

コマンドを実行すると、必要なファイルの作成と Gemfile の作成までが行なわれており Bundler による Gem のインストールまでは行われません。

Bundlerを使ったGemパッケージのインストール(3)

ではアプリケーションの作成に伴って作成されたディレクトリのルートを見て下さい。次のように「Gemfile」というファイルが作成されています。

Bundlerを使ったGemパッケージのインストール(4)

Bundlerを使ったGemパッケージのインストール(5)

「Gemfile」はテキストファイルです。テキストエディタで開いてみると次のような内容となっています。

source "https://rubygems.org"

ruby "3.3.2"

# Bundle edge Rails instead: gem "rails", github: "rails/rails", branch: "main"
gem "rails", "~> 7.1.3", ">= 7.1.3.4"

# The original asset pipeline for Rails [https://github.com/rails/sprockets-rails]
gem "sprockets-rails"

# Use sqlite3 as the database for Active Record
gem "sqlite3", "~> 1.4"

# Use the Puma web server [https://github.com/puma/puma]
gem "puma", ">= 5.0"

# Use JavaScript with ESM import maps [https://github.com/rails/importmap-rails]
gem "importmap-rails"

# Hotwire's SPA-like page accelerator [https://turbo.hotwired.dev]
gem "turbo-rails"

# Hotwire's modest JavaScript framework [https://stimulus.hotwired.dev]
gem "stimulus-rails"

# Build JSON APIs with ease [https://github.com/rails/jbuilder]
gem "jbuilder"

# Use Redis adapter to run Action Cable in production
# gem "redis", ">= 4.0.1"

# Use Kredis to get higher-level data types in Redis [https://github.com/rails/kredis]
# gem "kredis"

# Use Active Model has_secure_password [https://guides.rubyonrails.org/active_model_basics.html#securepassword]
# gem "bcrypt", "~> 3.1.7"

# Windows does not include zoneinfo files, so bundle the tzinfo-data gem
gem "tzinfo-data", platforms: %i[ windows jruby ]

# Reduces boot times through caching; required in config/boot.rb
gem "bootsnap", require: false

# Use Active Storage variants [https://guides.rubyonrails.org/active_storage_overview.html#transforming-images]
# gem "image_processing", "~> 1.2"

group :development, :test do
  # See https://guides.rubyonrails.org/debugging_rails_applications.html#debugging-with-the-debug-gem
  gem "debug", platforms: %i[ mri windows ]
end

group :development do
  # Use console on exceptions pages [https://github.com/rails/web-console]
  gem "web-console"

  # Add speed badges [https://github.com/MiniProfiler/rack-mini-profiler]
  # gem "rack-mini-profiler"

  # Speed up commands on slow machines / big apps [https://github.com/rails/spring]
  # gem "spring"
end

group :test do
  # Use system testing [https://guides.rubyonrails.org/testing.html#system-testing]
  gem "capybara"
  gem "selenium-webdriver"
end

文頭に"#"があるものはコメントです。細かい記述の仕方はここでは省略させて頂きますが、例えば次のようなことが書かれています。

#必要となる Ruby のバージョン
ruby "3.3.2"

#rails 7.1.3.4 以上、 7.2.0 未満
gem "rails", "~> 7.1.3", ">= 7.1.3.4"

#puma 5.0以上
gem "puma", ">= 5.0"

#任意のバージョン
gem "jbuilder"

次に Gemfile を元に Bundler を使って Gem のインストールを行います。

コマンドプロンプトを起動したあと、対象のアプリケーションディレクトリに移動し、その後で「bundle install」と実行して下さい。

bundle install

Bundlerを使ったGemパッケージのインストール(6)

Bundlerを使ったGemパッケージのインストール(7)

これで必要な Gem パッケージがインストールされました。

なお先ほど実行した bundle は Ruby をインストールしたディレクトリの中の bin ディレクトリの中にあります。

Bundlerを使ったGemパッケージのインストール(8)

Gemfile.lockとは

bundle install を実行すると、アプリケーションのディレクトリの中に新しく「Gemfile.lock」という名前のファイルが作成されています。

Gemfile.lockとは(1)

「Gemfile.lock」は Bundler によってインストールされた Gem パッケージの名前と実際のバージョンを記録したものです。このファイルには Gemfile に記載された Gem の依存関係にある Gem も含めて記載されます。

「Gemfile.lock」ファイルはテキストファイルです。テキストエディタで開いてみます。(かなり長いので途中を省略しています)。

GEM
  remote: https://rubygems.org/
  specs:
    actioncable (7.1.3.4)
      actionpack (= 7.1.3.4)
      activesupport (= 7.1.3.4)
      nio4r (~> 2.0)
      websocket-driver (>= 0.6.1)
      zeitwerk (~> 2.6)
    actionmailbox (7.1.3.4)
      actionpack (= 7.1.3.4)
      activejob (= 7.1.3.4)
      activerecord (= 7.1.3.4)
      activestorage (= 7.1.3.4)
      activesupport (= 7.1.3.4)
      mail (>= 2.7.1)
      net-imap
      net-pop
      net-smtp
    actionmailer (7.1.3.4)
      actionpack (= 7.1.3.4)
      actionview (= 7.1.3.4)
      activejob (= 7.1.3.4)
      activesupport (= 7.1.3.4)
      mail (~> 2.5, >= 2.5.4)
      net-imap
      net-pop
      net-smtp
      rails-dom-testing (~> 2.2)
    actionpack (7.1.3.4)
      actionview (= 7.1.3.4)
      activesupport (= 7.1.3.4)
      nokogiri (>= 1.8.5)
      racc
      rack (>= 2.2.4)
      rack-session (>= 1.0.1)
      rack-test (>= 0.6.3)
      rails-dom-testing (~> 2.2)
      rails-html-sanitizer (~> 1.6)
    actiontext (7.1.3.4)
      actionpack (= 7.1.3.4)
      activerecord (= 7.1.3.4)
      activestorage (= 7.1.3.4)
      activesupport (= 7.1.3.4)
      globalid (>= 0.6.0)
      nokogiri (>= 1.8.5)

    -- (途中略) -- 

    rubyzip (2.3.2)
    selenium-webdriver (4.21.1)
      base64 (~> 0.2)
      rexml (~> 3.2, >= 3.2.5)
      rubyzip (>= 1.2.2, < 3.0)
      websocket (~> 1.0)
    sprockets (4.2.1)
      concurrent-ruby (~> 1.0)
      rack (>= 2.2.4, < 4)
    sprockets-rails (3.5.1)
      actionpack (>= 6.1)
      activesupport (>= 6.1)
      sprockets (>= 3.0.0)
    sqlite3 (1.7.3-x64-mingw-ucrt)
    stimulus-rails (1.3.3)
      railties (>= 6.0.0)
    stringio (3.1.0)
    strscan (3.1.0)
    thor (1.3.1)
    timeout (0.4.1)
    turbo-rails (2.0.5)
      actionpack (>= 6.0.0)
      activejob (>= 6.0.0)
      railties (>= 6.0.0)
    tzinfo (2.0.6)
      concurrent-ruby (~> 1.0)
    tzinfo-data (1.2024.1)
      tzinfo (>= 1.0.0)
    web-console (4.2.1)
      actionview (>= 6.0.0)
      activemodel (>= 6.0.0)
      bindex (>= 0.4.0)
      railties (>= 6.0.0)
    webrick (1.8.1)
    websocket (1.2.10)
    websocket-driver (0.7.6)
      websocket-extensions (>= 0.1.0)
    websocket-extensions (0.1.5)
    xpath (3.2.0)
      nokogiri (~> 1.8)
    zeitwerk (2.6.15)

PLATFORMS
  x64-mingw-ucrt

DEPENDENCIES
  bootsnap
  capybara
  debug
  importmap-rails
  jbuilder
  puma (>= 5.0)
  rails (~> 7.1.3, >= 7.1.3.4)
  selenium-webdriver
  sprockets-rails
  sqlite3 (~> 1.4)
  stimulus-rails
  turbo-rails
  tzinfo-data
  web-console

RUBY VERSION
   ruby 3.3.2p79

BUNDLED WITH
   2.5.11

新しいアプリケーションを作成する場合、 Gemfile が自動で作成され、インストール結果によって Gemfile.lock ファイルも自動で生成されます。他の環境で同じアプリケーションの開発を行う場合は、既に作成された Gemfile と Gemfile.lock をアプリケーションディレクトリに保存し、 bundle install を実行すると、 Gemfile.lock を元に Gem のインストールを行います。

この結果、複数の環境で分かれてアプリケーションを開発する場合でも、簡単に同じバージョンの Gem を使用して開発を行うことができます。

-- --

Bundler を使って複数の環境で同じバージョンの Gem を使用する方法について解説しました。

( Written by Tatsuo Ikura )

Profile
profile_img

著者 / TATSUO IKURA

プログラミングや開発環境構築の解説サイトを運営しています。