Rubyで使うGemやBundlerについてごちゃごちゃになるので整理しました。
環境
Rubyはrbenvを使用。
Mac | 13.1(22C65) |
rbenv | 1.2.0 |
Ruby | 2.7.0 |
Rails | 7.0.5 |
Gem | 3.1.2 |
Bundler | 2.1.2 |
Gem
GemとはRubyのライブラリのこと。 ライブラリとは、何かしらの機能を実装するためのまとまっているプログラムのこと。
Gemを使うためには、RubyGemsでインストールする方法と、Bundlerでインストールする方法の2種類ある。
RubyGems
RubyGemsとは、Gemのパッケージ管理システム。 パッケージ管理システムとは、コマンド1つでライブラリのインストールやアップデートなどの操作を行うための仕組みのこと。パッケージとライブラリは同じようなもの。
RubyGemsはGemを扱うためのgemコマンドを提供していて、Gemの操作ができる。
RubyGems本体をインストールする
RubyGems本体はRubyがインストールされるときに同時に標準ライブラリとしてインストールされているので、gem -v
でインストールされているか確認する。
gem -v
バージョンが表示されればインストールされている。表示されていなければRubyをインストールする。
gemをインストールする
gemをインストールするには、gem install
を実行する。
gem install [gem]
インストールされているgemを表示する
インストールされているgemを表示には、gem list
を実行する。
gem list
gemをアンインストールする
gemをアンインストールするには、gem uninstall
を実行する。
gem uninstall [gem]
gemをアップデートする
gemのバージョンをアップデートするには、gem update
を実行する。
gem update [gem]
gemコマンドでインストールする問題点
gemは単体で成り立つことは少なく、動作させるために他のgemも必要とする場合が多い。このgem同士の関連のことを依存関係という。
gem install
だと関連するその他のgemも1つずつバージョンを気にしながらインストールしなければならなくなるので、まず不可能。
そのため、gemはBundlerを使って一括でインストールするのが普通。
Bundler
Bundlerとは、gemを管理するgemのこと。 bundlerコマンドが提供されていて、gemを一括で管理できる。
Bundler本体をインストールする
Bundlerはgemなので、gem install
でインストールする。
gem install bundler
インストールされているかは、bundler -v
でバージョンが表示されるかどうかで確認する。
bundler -v
Bundlerでgemをインストールする
Bundlerを使ったgemのインストールは、GemfileとGemfile.lockという2つのファイルを使って行う。
インストールの手順は以下の通り。
- 空のGemfileを作成する
- Gemfileにインストールしたいgemを記述する
bundler install
を実行する
1.空のGemfileを作成する
空のGemfileを作成する。
Gemfileはインストールしたいgemとバージョンを記述するファイル。
touch
コマンドで作成してもいいが、Gemfileはbundler init
でも作成できる。
bundler init
bundler init
で生成されたGemfileは以下の内容になっている。
# frozen_string_literal: true source "https://rubygems.org" # gem "rails"
# frozen_string_literal: true
は無視してOK。
source
はgemのインストール元。
# gem "rails"
はrailsのgemをインストールする記述をコメントアウトしたもの。
2.Gemfileにインストールしたいgemを記述する
インストールしたいgemをGemfileに記述する。 例としてコメントアウトされていたrailsをインストールしてみる。他のgemを記述してもOK。
Gemfileの例
# frozen_string_literal: true source "https://rubygems.org" gem "rails"
このようにインストールしたいgemをgem "gem名"
と書く。
3.bundler install
を実行する
ファイルを作れたので、bundler install
でgemをインストールする。
bundler install
インストールが完了すると、以下の内容のGemfile.lockというファイルが作成される。
GEM remote: https://rubygems.org/ specs: actioncable (7.0.5) actionpack (= 7.0.5) activesupport (= 7.0.5) nio4r (~> 2.0) websocket-driver (>= 0.6.1) actionmailbox (7.0.5) actionpack (= 7.0.5) activejob (= 7.0.5) activerecord (= 7.0.5) activestorage (= 7.0.5) activesupport (= 7.0.5) mail (>= 2.7.1) net-imap net-pop net-smtp actionmailer (7.0.5) actionpack (= 7.0.5) actionview (= 7.0.5) activejob (= 7.0.5) activesupport (= 7.0.5) mail (~> 2.5, >= 2.5.4) net-imap net-pop net-smtp rails-dom-testing (~> 2.0) actionpack (7.0.5) actionview (= 7.0.5) activesupport (= 7.0.5) rack (~> 2.0, >= 2.2.4) rack-test (>= 0.6.3) rails-dom-testing (~> 2.0) rails-html-sanitizer (~> 1.0, >= 1.2.0) actiontext (7.0.5) actionpack (= 7.0.5) activerecord (= 7.0.5) activestorage (= 7.0.5) activesupport (= 7.0.5) globalid (>= 0.6.0) nokogiri (>= 1.8.5) actionview (7.0.5) activesupport (= 7.0.5) builder (~> 3.1) erubi (~> 1.4) rails-dom-testing (~> 2.0) rails-html-sanitizer (~> 1.1, >= 1.2.0) activejob (7.0.5) activesupport (= 7.0.5) globalid (>= 0.3.6) activemodel (7.0.5) activesupport (= 7.0.5) activerecord (7.0.5) activemodel (= 7.0.5) activesupport (= 7.0.5) activestorage (7.0.5) actionpack (= 7.0.5) activejob (= 7.0.5) activerecord (= 7.0.5) activesupport (= 7.0.5) marcel (~> 1.0) mini_mime (>= 1.1.0) activesupport (7.0.5) concurrent-ruby (~> 1.0, >= 1.0.2) i18n (>= 1.6, < 2) minitest (>= 5.1) tzinfo (~> 2.0) builder (3.2.4) concurrent-ruby (1.2.2) crass (1.0.6) date (3.3.3) erubi (1.12.0) globalid (1.1.0) activesupport (>= 5.0) i18n (1.14.1) concurrent-ruby (~> 1.0) loofah (2.21.3) crass (~> 1.0.2) nokogiri (>= 1.12.0) mail (2.8.1) mini_mime (>= 0.1.1) net-imap net-pop net-smtp marcel (1.0.2) method_source (1.0.0) mini_mime (1.1.2) mini_portile2 (2.8.2) minitest (5.18.1) net-imap (0.3.6) date net-protocol net-pop (0.1.2) net-protocol net-protocol (0.2.1) timeout net-smtp (0.3.3) net-protocol nio4r (2.5.9) nokogiri (1.15.2) mini_portile2 (~> 2.8.2) racc (~> 1.4) racc (1.7.1) rack (2.2.7) rack-test (2.1.0) rack (>= 1.3) rails (7.0.5) actioncable (= 7.0.5) actionmailbox (= 7.0.5) actionmailer (= 7.0.5) actionpack (= 7.0.5) actiontext (= 7.0.5) actionview (= 7.0.5) activejob (= 7.0.5) activemodel (= 7.0.5) activerecord (= 7.0.5) activestorage (= 7.0.5) activesupport (= 7.0.5) bundler (>= 1.15.0) railties (= 7.0.5) rails-dom-testing (2.0.3) activesupport (>= 4.2.0) nokogiri (>= 1.6) rails-html-sanitizer (1.6.0) loofah (~> 2.21) nokogiri (~> 1.14) railties (7.0.5) actionpack (= 7.0.5) activesupport (= 7.0.5) method_source rake (>= 12.2) thor (~> 1.0) zeitwerk (~> 2.5) rake (13.0.6) thor (1.2.2) timeout (0.3.2) tzinfo (2.0.6) concurrent-ruby (~> 1.0) websocket-driver (0.7.5) websocket-extensions (>= 0.1.0) websocket-extensions (0.1.5) zeitwerk (2.6.8) PLATFORMS ruby DEPENDENCIES rails BUNDLED WITH 2.1.2
Gemfile.lockは実際にインストールされたgemとバージョンの一覧が自動的に記述されるファイルで、開発者が直接編集することはない。
例のように、railsのgemだけでなく、railsのgemに関連するgemの一覧も確認できる。
gem install
でgemをインストールする場合は、関連するgemも1つずつインストールしていかなければならないが、bundler install
によって必要となるgemを1回でインストールできる。
Gemfile.lockが必要な理由
複数人で開発したり開発環境と本番環境を揃えたい場合、Gemfileだけ共有してgemのインストールを行うと、インストールする時期によって元のバージョンとは異なるバージョンがインストールされることがある。
そのため、他の環境でも同じバージョンに揃えるためにgemとバージョンが一覧になったGemfile.lockが必要になる。
bundler updateとgem updateの違い
Bundlerにはbundler update
というコマンドが存在するが、これは1つのgemのバージョンを更新するgem update
とは異なり、Gemfileを元にgemをインストールし、その後Gemfile.lockを更新するコマンド。
bundler installとbundler updateの違い
bundler install
とbundler update
の違いは、bundler install
はGemfile.lockを元にgemをインストールし、bundler update
はGemfileを元にインストールする点。
bundler install
は関連するgemのバージョンも全て記述されているGemfile.lockを元にするので、バージョンが固定された状態でインストールが行われる。
bundler update
は関連するgemが記述されていない、ただインストールしたいgemだけが記述されたGemfileを元にするので、gemが意図しないバージョンに更新される可能性がある。
よってgemを追加したり削除する、他の人と環境を揃えたりするときはbundler install
を使い、Gemfileに記述されているgemのバージョンを変更した場合はbundler update
を使う。
--pathをつけてbundler installを実行する
--path
をつけてbundler install
を実行すると、プロジェクトだけにgemがインストールされる。2回目以降はインストール先が記憶されるので、bundler install
のみでOK。
bundler install --path [フォルダ]
--path
を指定しない場合は、PCにインストールされる。
今回はrbenvを使っているので、/Users/ユーザー名/.rbenv/versions/バージョン名/lib/ruby/gems/
以下にgemがインストールされる。