ruby

【Rails】bundle installとbundle updateの違い。gemやGemfileについても

Railsチュートリアルを進めているとbudle installやbundel updateといったコマンドを使うことになります。

このブログを書いてる時点ではRailsチュートリアルの2章まで走破しています。

2章まで進める中で、冒頭にかいたbundel installやbundle upadateの違いや、そもそもgemやGemfileって?というところが気になったので、ちょっと調べてみました。

今回はその調べてみた結果を自分なりに解説していきます。

タイトルにはRailsと書いていますが、厳密にはRailsではRubyに関しての話しになります。

Bundlerとは

Bundler。

冒頭ではbundel install、bundle updateと書いていましたが、これはBundlerの機能になります。

ではBundlerとはなんぞや?

Bundlerとはgem同士の互換性を保ちながらgemのパッケージの種類やバージョンを管理してくれる仕組みのことです。

gemとは

Bundlerの説明をしていたら、gemという言葉が出てきましたね。

gemとはRubyのパッケージ(ライブラリ)のことになります。

また、パッケージを管理するパッケージ管理システムの名前としても使われます。

パッケージ

まずはパッケージとしてのgem。

パッケージとは、プログラムの部品で便利な機能をひとまとめにしたものになります。

パッケージを使用することで、1から部品をプログラミングする必要なく機能を実装できるので開発効率が大きく向上します。

gemにはたくさんの種類があり、例えばユーザー登録や認証といった複雑な機能も、gemを使えば簡単に実装となります。

パッケージ管理システム

次はパッケージ管理システムとしてのgem。

パッケージ管理システムはgemを管理するシステムであるRubyGamesのことを指しており、これをgemと呼ぶことがあります。

パッケージ管理システムはgemのインストール、アンインストールなどを行う際に使用しますが、RubyGamsを使ってgemを管理する機会はあまりなく、「Bundler」というパッケージ管理システムを使うことが多いです。

Bundlerとは その2

gemの接目のなかでBundlerという言葉が出てきましたね。

BUndlerとはパッケージ管理システムのことです。

機能は先に書いたとおり、

gem同士の互換性を保ちながらgemのパッケージの種類やバージョンを管理してくれる仕組みのことです。

そして、Bundler自身もgemになります。

Bundlerのインストール方法は下記のコマンドになります。

Bundlerのどこが便利かというと、gemの依存関係を保ちながらgemの管理ができるという点になります。

例えば、gem1のバージョン10を使用するためにgem2のバージョン5が必要なとき、gem1とgem2は依存関係があることになります。

この時、単にgem1とgem2をインストールすれば良いわけではなく、バージョンまで意識してインストールする必要が出てきます。
(gem2のバージョン7をインストールしてしまうと、gem1が正しく動作しなくなる可能性があります)

このような感じで、gem同士には依存関係が多々あり、使用するgemが増えれば増えるほど依存関係は複雑になっていきます。

Bundlerはこのようなgemの依存関係を管理できるツールで、使用することによって、依存関係にあるgemを正しいバージョンで一括にインストールすることができます。

このBundlerのコマンドがbundle installとbundle updateになります。

Gemfileとは

Bundlerが何かわかったところで、Bundlerのコマンドである、bundle installとbundle updateの説明に行きたいところですが、その前にGemfileについて説明しておく必要があります。

GemfileにはGemfileとGemfile.lockの2種類があり、それぞれ役割が異なります。

Gemfile

Gemfileとはgemをインストールするための「設計図」のようなものになります。

この「設計図」に時運のアプリケーションに必要なgemを記述します。

Gemfile.lock

Gemfile.lockとは実際にgemをインストールした後の結果を記録しているファイルになります。

先にも書いたとおり、gemには依存関係があるので、Gemfileに記述したgemと依存関係があるgemもBundlerが自動でインストールしてくれます。

Gemfile.lockには自動でインストールされたgemも記載されます。

bundle installとbundle updateの違い

ここでやっとBundlerの機能である、bundle installとbundle updateの説明になります。

bundle install

コマンドは下記の通りです。

bundle installを実行すると、gemfile.lockを元にgemのインストールを行ます。

この時、Gemfile.lockに記述されていない、且つGemfileに記述されているgemがある場合はそのgemとそのgemと依存関係のあるgemをインストール後、gemfile.lockを更新します。

つまり、実際にインストールした結果をもとにgemファイルのインストールを行い、実際にインストールしたgemとGemfileに記述されている差分のgemもインストールすることになります。

bundle update

コマンドは下記の通りです。

bundle updateを実行すると、gemfileを元にgemをインストール後、Gemfile.lcokを更新します。

実際にインストールした結果(Gemfile.lock)は関係なく、1からGemfileに記述されているgemをインストールすることになります。

bundle installとbundle updateの使い分け

bundle installとbundle updateの使い分けですが、名前の通りとなっています。

bundle installは新しい環境を作成する時に行い、bundle updateはgemのバージョンを更新する時に使用します。

プロジェクトに新しい開発者が入ってきた場合などは、bundle installを使って、他の開発者が使用しているGemfile.lockを元に環境を構築します。

まとめ

gem、Gemfile、bundler、bundle install、bundle updateについて説明しましたが、いかがだったでしょうか?

Railsチュートリアルでは不意にGemfileを編集し、bundle installを行い、失敗したらbundle updateを実行するように記載されているので、gemについては把握していても、Gemfileやbundle install、bundel updateはなんとなく実行してしまって、きちんと理解しないまま進んでしまいがちです。

そこをなんとなくではなく、きちんと何をしているのかということを知ることは大事です。
(RailsチュートリアルはそんなことよりもRailsの中身についての理解を深めさせるために、余計な情報を入れ込まないようにしているのかもしれませんが。)

これからもこのように気になったことや、何となくやってしまってることをブログにまとめて自分の理解を深めていきます。

Railsの中で使用されるRubyの本になります。

Railsチュートリアルをやる前にRubyはProgateなどで学習している方も多いかと思いますが、Progateからさらに発展したRubyの入門書になります。

RailsはRubyで記載するとはいえ、Rubyの文法にはあまり触れられないので、Railsチュートリアルを受けるための相棒としてオススメです。

ABOUT ME
Jyu2
ソフトウェア会社(SIer)で10年以上勤務のシステムエンジニア|ポケットWiFi使用歴2年以上|ポケットWiFi+αで快適でお得なインターネット環境を構築するための情報を発信|その他、IT情報やWebサービス、アプリ、ガジェットなどの情報を発信|自分と他の人のカバンの中身を紹介するメディア「カバンの中身ラボ(https://kaban-no-nakami-labo.com/)」も運営しています。 ポケットWiFi選びに迷ったらTwitter、お問合せフォームからご連絡ください。