【初心者向け】GemfileとGemfile.lockの違い

Ruby

Railsアプリを作成するとGemfileとGemfile.lockという二つの似たようなファイルが作成されます。

Webアプリの開発経験が少ない人にとってGemfileの概念は少しとっつきにくいと思います。

今回は初学者向けにGemfileとGemfile.lockの違いについて説明をしたいと思います。

今回は以下のような方向けの記事になっています。

こんな人に向けの記事です
  • Gemfile, Gemfile.lockの違いがわからない
  • パッケージ管理システムの概念をよく知らない

Rubygems

まずGemfileの説明をする前にgemについて説明します。

gemとは正式にはRubyGemsというもので、Ruby用のライブラリを管理するシステムのことをいいます。

gemを利用することで簡単にRubyライブラリを利用することができるメリットがあります。

なお、ライブラリの管理システムは各言語ごとに用意されており、例えばNode.jsのnpm, Pythonのpip, Javaのmavenなどがあります。

gemはパッケージ管理システムのことを指すのですが、日常では「xxxのgemを新しく導入したよ」とか「xxxのgemにバグがったよ」のようにパッケージ自身をgemと呼ぶ場合も多いです。

ですので、gemという言葉が管理システムのことを指すのかライブラリ自身のことを指すのかについては結構あいまいです。

以降での説明ではgemという言葉にRubyライブラリの意味も含んでいるという前提で話を進めたいと思います。

Gemfile

GemfileとはRailsアプリで利用するgemが記述されているファイルのことです。

Gemfileを参照することで、Railsアプリを動作させるためにはどのgemをインストールすればいいのかがわかります。

gemをインストールするときはbundle installというコマンドを実行するのですが、このときbundlerがGemfileを参照し、Gemfileに記述されているgemの中でインストールされていないものを見つけてインストールを実行します。

Gemfileの役割
  • Railsアプリを実行するのに必要なgemを一覧で表示する

Gemfile.lock

GemfileにはRailsアプリで利用するgemの一覧が表示されていると説明しました。

しかし、gemは様々なgemと依存関係になっているものもありますし、gemのバージョンが異なることで挙動が変わってくることもあります。

Gemfile.lockはGemfileを元に実際にインストールされたgemに加え、依存関係にあるgemが記述されたファイルになります。

また、Gemfile.lockには実際にインストールしたgemの具体的なバージョンも記述されています。

ですので、Gemfileは「アプリで必要なgemリスト」、Gemfile.lockで「実際にインストールしたgemリスト」が記述されています。

新しくgemをRailsアプリで利用したい場合は以下のようになります。

gemを新しく追加するときの流れ
  1. Gemfileを更新
  2. bundle installを実行
  3. Gemfile.lockが自動的に更新される

Gemfile.lockについてまとめると以下のようになります。

Gemfile.lockの役割
  • 実際にインストールしたgemの具体的なバージョンを記述する
  • Railsアプリに実際にインストールされたgemを依存関係にあるgemも含めて一覧で表示する