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の中でインストールされていないものを見つけてインストールを実行します。
- 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アプリで利用したい場合は以下のようになります。
- Gemfileを更新
- bundle installを実行
- Gemfile.lockが自動的に更新される
Gemfile.lockについてまとめると以下のようになります。
- 実際にインストールしたgemの具体的なバージョンを記述する
- Railsアプリに実際にインストールされたgemを依存関係にあるgemも含めて一覧で表示する