Ruby

gemspec と Gemfile と Gemfile.lock との違い.

More than 5 years have passed since last update.

Ruby で gem 管理に使われる Bundler. その Bundler で依存関係を解決するために使われるファイルには,

  • gemspec
  • Gemfile
  • Gemfile.lock

の 3 つがあります.これら 3 つのファイルの区別を意識することはあまりありませんが,それぞれ異なる役割を担っています.

3 つのファイルの役割

各ファイルの役割を簡単にまとめます.

gemspec

  • gem の依存関係を記述します.

Gemfile

  • 依存する gem の取得先を記述します.
    • 通常は取得先は source 行一行だけでよいはず.
    • GitHub リポジトリなどから edge バージョンを取得する場合は,その場所をここに書く.

Gemfile.lock

  • 開発環境と運用環境とで同じ gem をインストールするために使います.
    • bundle などで自動で生成されます.
    • 依存 gem のバージョンと取得先が記録されます.

Gemfile.lock の扱いについて

Gemfile.lock については,これをリポジトリに含めるかどうかが議論されるのですが,前節で述べたように,「開発環境と運用環境とで同じ gem をインストール」したいかどうかで決めればよいかと思います.すなわち,

  • 確実動作が期待されるアプリでは Gemfile.lock をリポジトリに含める.
  • デプロイの自由度を確保したいライブラリは Gemfile.lock をリポジトリに含めない.
  • (そうでないものは,開発環境=運用環境としたい気持ちの強さでどちらかに倒す)

とするのがよいでしょう.

参考