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

Ruby

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

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

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

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

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

gem

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

gemとはRubyのライブラリのことをいいます。

gemはRubyGemsと呼ばれるRuby用のパッケージ管理システムで管理されており、RubyGemsが提供するgemコマンドを通じてインストール等ができます。

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

gemを利用することで0から開発をしなくても手軽に便利な機能を実装することが可能です。

Railsアプリで使われる有名なgemには例えばログイン機能を提供するdevise、検索機能を提供するransackなどがあります。

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も含めて一覧で表示する