Gemfileとbundle installの関係!
概要
直近で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