【Ruby】Gemfileとbundlerの基本:パッケージ管理を理解する

Ruby

こんにちは、かつコーチです。

Rubyでライブラリを使おうとすると、必ず出てくるのが「Gemfile」と「bundler」という言葉です。

私も最初は「gemって何?」「bundle installって何をしているの?」と、意味も分からずコマンドをコピペしていました。

この記事では、gemとは何かという基礎から、Gemfile・Gemfile.lockの役割、bundle installの挙動までを丁寧に解説します。

基本の書き方・実装手順

gemとはRubyの外部ライブラリ

gemとは、Rubyで使える外部ライブラリをパッケージ化したものです。

他の人が作った便利な機能を、gem installコマンド一つで自分のプロジェクトに取り込めます。

gem install rails

たとえばrailsというgemを使えば、Ruby on Railsのフレームワーク機能をまるごと利用できるようになります。

gemを集めて公開・共有する場所として、RubyGems.orgというサイトが使われています。

Gemfileでプロジェクトの依存関係を管理する

Gemfileとは、そのプロジェクトで使用するgemの一覧を記述するファイルです。

プロジェクトのルートディレクトリに置き、以下のように記述します。

# Gemfile
source "https://rubygems.org"

ruby "3.4.1"

gem "rails", "~> 7.1"
gem "pg", "~> 1.5"

group :development, :test do
  gem "rspec-rails"
end

gem "rails", "~> 7.1"のように、バージョンを指定できるのがポイントです。

~>は「このバージョン以上、かつメジャーバージョンが変わらない範囲」を意味する記法で、意図しない大きな変更を避けられます。

groupブロックを使うと、開発環境やテスト環境だけで使うgemを分けて管理できます。

bundle installでgemを一括インストールする

Gemfileを書いたら、bundlerというツールを使って一括インストールします。

bundle install

このコマンドを実行すると、bundlerはGemfileに書かれたgem同士の依存関係を解決し、実際にインストールしてくれます。

そして処理が終わると、Gemfile.lockというファイルが自動生成されます。

Gemfile.lockが持つ役割

Gemfile.lockとは、実際にインストールされたgemの正確なバージョンを記録するファイルです。

Gemfileが「使いたいgemのバージョン範囲」を示すのに対し、Gemfile.lockは「実際に確定した1つのバージョン」を記録します。

GEM
  remote: https://rubygems.org/
  specs:
    rails (7.1.3)
    rack (2.2.9)
    ...

RUBY VERSION
   ruby 3.4.1p0

このファイルをチーム全員で共有すれば、誰の環境でも全く同じバージョンのgemが使われることが保証されます。

よくあるつまずきポイント・エラー対処

bundle installのはずが個別インストールしてしまう

❌ Before

$ gem install rails
$ rails new my_app

私が初心者のころ、チュートリアル通りにgem installだけで環境構築を進めてしまい、後からチームメンバーと環境が微妙に食い違うトラブルに遭遇しました。

gem installはシステム全体にgemを入れるコマンドで、プロジェクトごとのバージョン管理には向いていません。

✅ After

$ bundle init
$ echo 'gem "rails", "~> 7.1"' >> Gemfile
$ bundle install

bundle initでGemfileの雛形を作り、必要なgemを追記してからbundle installを実行するのが正しい手順です。

こうすればGemfile.lockが生成され、チーム全員が同じバージョンのgemで開発できます。

Gemfile.lockをGitで無視してしまう

❌ Before

# .gitignore
Gemfile.lock

.gitignoreにGemfile.lockを含めてしまい、チームメンバーがbundle installするたびに微妙に異なるバージョンのgemが入ってしまうことがありました。

その結果、「自分の環境では動くのに、他の人の環境ではエラーになる」という原因調査に半日費やしてしまいました。

Bundler could not find compatible versions for gem "rack"

✅ After

# .gitignore
# Gemfile.lock は含めない(アプリケーションの場合)

アプリケーション開発の場合、Gemfile.lockは必ずGitにコミットするのが基本です。

例外として、複数の環境で動かすことを前提にしたgem自体(ライブラリ)を開発する場合は、Gemfile.lockをコミットしないのが慣習になっています。

bundle installで権限エラーが出る

❌ Before

$ bundle install
Errno::EACCES: Permission denied @ dir_s_mkdir - /usr/lib/ruby/gems

システムのRubyを直接使っている環境で、権限不足によりgemのインストールに失敗するケースです。

✅ After

$ rbenv install 3.4.1
$ rbenv local 3.4.1
$ bundle install

rbenvなどのバージョン管理ツールでRubyをユーザー権限にインストールしていれば、この権限エラーは発生しません。

sudo bundle installで無理やり通す方法もありますが、環境が汚れる原因になるため避けましょう。

まとめ

この記事のポイント

  • gemはRubyの外部ライブラリで、gem installで個別にインストールできる
  • Gemfileはプロジェクトで使うgemの一覧とバージョン範囲を記述するファイルである
  • bundlerbundle installでGemfileの依存関係を解決し、gemを一括インストールするツールである
  • Gemfile.lockは実際にインストールされたバージョンを固定するファイルで、アプリケーション開発では必ずGitにコミットする
  • 権限エラーが出る場合は、rbenvなどでRubyをユーザー権限にインストールしているか確認する

次に読むべき記事

環境まわりの理解が深まったら、次はいよいよRubyらしい設計の考え方に進みましょう。

「オブジェクト指向設計の基本原則(Ruby流のSOLID入門)」で、良いクラス設計の考え方を解説しています。

タグ: #Ruby #初心者向け #環境構築

タイトルとURLをコピーしました