GemとBundlerを整理

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のライブラリのこと。 ライブラリとは、何かしらの機能を実装するためのまとまっているプログラムのこと。

RubyフレームワークであるRailsもGemの1つ。

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つのファイルを使って行う。

インストールの手順は以下の通り。

  1. 空のGemfileを作成する
  2. Gemfileにインストールしたいgemを記述する
  3. 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 installbundler 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がインストールされる。