📘

Gemfileとbundle installの関係!

2024/05/26に公開

概要

直近でRailsの環境構築を2度行うことがあり、gem/Gemfile/Gemfile.lockあたりとbundle installコマンドとの関係性について詳しく知っておいた方が良いと思い記事にすることにしました。

そもそもgemとは?

gemとは、Rubyのパッケージ管理システムであるRubyGemsを通して提供されるパッケージやライブラリの形式のことです。つまり、Rubyの中にRubyGemsというパッケージ管理システムがあり、それらをGemでインストールしているということになります。
頻繁にgemを使ってインストールされるパッケージやライブラリは以下のようなものです。

# railsフレームワークそのもの
gem 'rails', '~> 6.1.0'

# webサーバーライブラリ
gem 'puma', '~> 5.0'

# 認証機能を実装しやすくするライブラリ
gen 'devise'

さらに、他の言語との比較も示すことで他の言語を使っていた方はイメージが湧きやすいかも?

言語 パッケージ管理システム パッケージの形式 パッケージの例
Ruby RubyGems Gem Rails, Devise
Python pip Wheel, tar.gz Django, Requests
PHP Composer Packagist Laravel, Guzzle

Gemfileとは?

このGemfileというのは、先ほどのgem 'rails', '~> 6.1.0'などのインストールしたいパッケージをまとめて記述したファイルのことです。
bundle installを実行するとこのGemfileに書かれている内容を元に依存関係を考慮しながらパッケージがインストールされていきます。
Gemfileを使わずにパッケージを一つずつ入れるには、gem install <gem_name> -vのように記述して実行するとインストールされます。

bundle installとは?

先ほど出てきたbundle installについて説明します。このコマンドは、Bundlerというツールによって提供されていて、このツールが各gemでインストールされるパッケージのバージョンなどを確認し、依存関係などを元に一括インストールを行ってくれます。
このbundle installを実行するには、まずgem install bundlerでbundlerをインストールする必要があります。

Gemfile.lockとは?

最後にGemfile.lockについて説明します。このGemfile.lockファイルは、bundle installを実行することで作成されるファイルのことです。このファイルには、現在どんなパッケージがインストールされているかがまとめて記述されています。つまり、現状アプリになんのパッケージがインストールされているのか、なんのパッケージはインストールされていないのかを確認するのに使えるファイルになります。

Gemfile → bundle install → Gemfile.lockの関係!

ここでは、Gemfile、bundle install、Gemfile.lockの関係と更新時の順序などについて説明します。
まず、初回のbundle installについて説明します。

初回のbundle installの場合、Gemfileを元にbundlerがgemをインストールして、その内容をGemfile.lockに記述していきます。

次に、一度bundle installは行っていて、その後にGemfileを変更し、再度bundle installを行った時の挙動について説明します。

この場合は、bundlerはGemfileの変更箇所だけを読み取り、gem installを実行します。つまり、すでにインストールされているパッケージの再インストールは行いません(バージョン変更などの変更は読み取り再インストールされます)。そして、変更があった場合のみGemfile.lockも更新してくれます。

まとめ

今回は、Gemfile/Gemfile.lockとbunder(bundle install)などの関係についてまとめました。
自分の中で、なんとなく使っていたコマンドを整理することができて、理解が深まりました!

Discussion