こんにちは、かつコーチです。
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の一覧とバージョン範囲を記述するファイルである
- bundlerは
bundle installでGemfileの依存関係を解決し、gemを一括インストールするツールである - Gemfile.lockは実際にインストールされたバージョンを固定するファイルで、アプリケーション開発では必ずGitにコミットする
- 権限エラーが出る場合は、rbenvなどでRubyをユーザー権限にインストールしているか確認する
次に読むべき記事
環境まわりの理解が深まったら、次はいよいよRubyらしい設計の考え方に進みましょう。
「オブジェクト指向設計の基本原則(Ruby流のSOLID入門)」で、良いクラス設計の考え方を解説しています。