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」が実行されていました。
この「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
※ 「-G」オプションについては「Railsアプリケーションを作成する」を参照されてください。
コマンドを実行すると、必要なファイルの作成と Gemfile の作成までが行なわれており Bundler による Gem のインストールまでは行われません。
ではアプリケーションの作成に伴って作成されたディレクトリのルートを見て下さい。次のように「Gemfile」というファイルが作成されています。
「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
これで必要な Gem パッケージがインストールされました。
なお先ほど実行した bundle は Ruby をインストールしたディレクトリの中の bin ディレクトリの中にあります。
Gemfile.lockとは
bundle install を実行すると、アプリケーションのディレクトリの中に新しく「Gemfile.lock」という名前のファイルが作成されています。
「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 )
著者 / TATSUO IKURA
これから IT 関連の知識を学ばれる方を対象に、色々な言語でのプログラミング方法や関連する技術、開発環境構築などに関する解説サイトを運営しています。