すでにメンバーの場合は

無料会員登録

GitHubアカウントで登録 Pikawakaが許可なくTwitterやFacebookに投稿することはありません。

登録がまだの方はこちらから

Pikawakaにログイン

GitHubアカウントでログイン Pikawakaが許可なくTwitterやFacebookに投稿することはありません。

Ruby

【Ruby】gemの仕組みを図解形式で学ぼう

ぴっかちゃん
ぴっかちゃん

gemとは、gem形式にパッケージングされたRuby言語用の外部ライブラリのことです。自作では大変な機能もgemを使うことによって簡単に実装することができます。

例えば、次のようなページネーションを実装する場合は各ページに合わせてデータを取得する必要があるので、自作となると少し大変です。

ページネーション

そこで「kaminari」というgemを使うことで、ページネーションを1からプログラム作成することなく簡単に実装することができます。

このようにRubyには便利なgemが豊富に揃っています。
この記事では、gemを理解するための 「用語」や「仕組み」について学んでいきます。

用語を整理しよう

gemは、Rubyでの開発において欠かすことができない存在です。学習している内にいつの間にかgemを使っていた方も多いでしょう。しかし「gemとは一体なんなのか」を調べても、次のように用語がたくさん出てくるのでイメージしにくいですね。

gemとは、gem形式にパッケージングされたRuby言語用の外部ライブラリのこと

そのため、この章ではgemを理解するために用語を1つ1つ整理していきます。

ライブラリとは

まずは「ライブラリ」について解説します。

ライブラリとは、「汎用性の高い機能を他のプログラムで呼び出して使えるように部品化して集めたファイル」のことです。

ライブラリ


例えば、次のようなページネーションのライブラリ(kaminari)の場合は、各ページのデータを取得する機能などページネーションでよく使われる便利な機能がまとめられています。

ライブラリの例

ライブラリは実行ファイルではないので、ライブラリ単体で動作することができません。

ライブラリ単体は動作しない

そのため、ライブラリは他の実行可能なファイル(プログラム)から呼び出されて機能が使われます。ライブラリの機能は、次のように他のプログラムから呼び出せるように「部品化」されています。

他のプログラムから呼び出せるように機能を部品化する

つまり、ライブラリは「他のプログラムに汎用性の高い機能を提供することを前提」として作られた部品の集まりです。

ライブラリの特徴
  1. 汎用性の高い機能を他のプログラムで呼び出して使えるように機能を部品化してあつめたファイルのこと
  2. 単体では動作せず、部品化した機能を他のプログラムから呼び出して利用する

Rubyのライブラリの種類

Rubyには、標準ライブラリ、組み込みライブラリ、外部ライブラリがあります。ライブラリによっては、「インストール」や「読み込み」が必要な場合があります。

rubyのライブラリの種類

各ライブラリの特徴は、以下の表の通りです。

種類 説明 インストール 読み込み
標準ライブラリの
組み込みではないライブラリ
Rubyインストール時に
Ruby本体としてインストールされるライブラリ
不要 必要
標準ライブラリの
組み込みライブラリ
Ruby本体に組み込まれるライブラリ(標準ライブラリに属する) 不要 不要
外部ライブラリ 有志の開発者が他の開発者も使えるように開発したライブラリ
(※Rubyインストール時に一緒にインストールされるものもある)
必要 必要

上記の表にあるように「外部ライブラリ」は有志の開発者が開発したライブラリで、機能を使うには「インストール」と「読み込み」が必要です。

外部ライブラリの特徴

そして、gemは外部ライブラリです。つまりgemを使う場合は「インストール」と「読み込み」が必要ということです。

ポイント
  1. Rubyには「標準ライブラリ、組み込みライブラリ、外部ライブラリ」がある
  2. gemは、外部ライブラリにあたる
  3. 外部ライブラリを使うには、「インストール」と「読み込み」が必要

gem(gemパッケージ)とは

実際には、外部ライブラリはいくつものディレクトリで構成されていますが、Rubyではほとんどの外部ライブラリは、gem形式(名前-バージョン.gem)という1つのファイルに(パッケージング)まとめられています。

gem形式にパッケージングする例

このように外部ライブラリのフォルダやファイルを1つのgem形式のファイルにパッケージングされたものをgem(gemパッケージ)と呼びます。

複数のディレクトリで構成されている外部ライブラリは、1つのファイルにパッケージングすることで他のプログラムに簡単に配布することができます。

gemパッケージの配布の様子

外部ライブラリをgem(gemパッケージ)にするメリットとして、RubyGemsというシステムを使うことができます。RubyGemsについては次の章で詳しく解説させていただきます。

ポイント

gem(gemパッケージ)とは、1つのgem形式のファイルにパッケージングされたRuby言語用の外部ライブラリのこと

RubyGemsとは?

RubyGemsは、(Ruby 1.9 以降から) Rubyインストール時にRuby本体としてにインストールされる「標準ライブラリ」です。 Ruby 1.9以降が使える環境ならば、RubyGemsを使うことができます。

RubyGemsを使うと、主に以下の操作を簡単に行うことができます。

  • gemのインストール
  • gemのアンインストール
  • インストール済みのgemのリストを表示
  • 利用可能なgemを検索

この操作を行うには、RubyGemsが提供するgemコマンドを使います。

インストールの場合は、次のようにgem install Gem名でRuby環境に指定したgemをインストールすることができます。

ターミナル | gemをインストールするgemコマンド
1
gem install [Gem名]

例えば、moneyというお金の通貨の変換を行ってくれるgemの場合は、次のように指定してインストールします。

ターミナル | gemをインストールするgemコマンド
1
2
3
4
gem install money
Fetching: money-6.14.1.gem (100%) Successfully installed money-6.14.1 1 gem installed # インストールが無事完了!

gemはインストールと読み込みが必要な外部ライブラリなので、上記のインストールだけではなく読み込みが必要です。

moneyのgemを使用する例

インストールしたmoneyの機能を使うには、次のようにirbを起動してrequireで読み込みます。

irb | インストールしたmoneyの読み込み
1
2
3
4
5
6
irb(main):001:0> require 'money' # インストールしたgemの読み込み
=> true # 以下はmoneyの機能の使用例
irb(main):002:0> currency = Money.new(1000, "USD").currency => #<Money::Currency id: usd, priority: 1, symbol_first: true, thousands_separator: ,, html_entity: $, decimal_mark: ., name: United States Dollar, symbol: $, subunit_to_unit: 100, exponent: 2, iso_code: USD, iso_numeric: 840, subunit: Cent, smallest_denomination: 1, format: > irb(main):003:0> currency.name => "United States Dollar"

また、インストール済みの不要なgemをシステムから削除する場合も、次のようにRubyGemsのgem uninstall [gem名]を実行するだけで簡単にアンインストールすることができます。

ターミナル | gemをアンインストールするgemコマンド
1
gem uninstall [Gem名]

先ほどインストールしたmoneyも、次のように削除することが出来ていますね。

ターミナル | moneyをアンインストールする場合
1
2
3
4
5
6
7
8
9
10
11
12
13
gem list --local money # ローカルにmoneyがあるか確認する

*** LOCAL GEMS ***

money (6.14.1) # ローカルに存在する

gem uninstall money # moneyをアンインストールする
Successfully uninstalled money-6.14.1 # アンインストールが無事完了!
gem list --local money # ローカルにmoneyがあるか確認する *** LOCAL GEMS *** # 何も表示されないので、moneyのgemは存在しない

以下の表にあるように、RubyGemsのgemコマンドを使用すれば簡単にgemパッケージの管理をすることができます。

コマンド 説明
gem install gem名 gemのインストール
gem uninstall gem名 gemのアンインストール
gem list インストール済みのgemのリストを表示
gem search -r 利用可能なgemをリモートリポジトリから検索

このことからRubyGemsは、gemを管理するパッケージ管理システムといえます。

RubyGemsとは
  1. Ruby 1.9 以降からの標準ライブラリ
  2. gemを管理してくれるパッケージ管理システム
  3. gemコマンドを使うことでgemのインストールなど操作を簡単に行える

それでは、gemはどこからインストール/検索することができているのでしょうか。
これを理解するために「RubyGems.org」について学んでいきます。

RubyGems.org

RubyGems.orgはGemの公開リポジトリで、他の開発者に共有するgemを公開することができます。(ソースコードは主にGithubで確認することができます。)

gemのホスティングサーバ

また、公開されたgemの詳細情報を検索することができます。

例えば、先ほどインストールしたmoneyを検索窓に入力して検索すると、次の画面が表示されて詳細情報を得ることができます。

moneyの詳細ページ

そして、先ほど解説したgemのインストールなど操作を簡単に行える「RubyGems」は、「RubyGems.org」の「クライアント」でもあります。

例えば、Ruby 1.9以降をインストールしたローカル環境下でRubyGemsを使用した場合は、次のようにRubyGems.orgにリクエストが送信されてレスポンスが返ります。

つまり、gam install moneyは、RubyGems.orgで公開されているgemを探してインストールしているのです。

gem installの流れ

これは、デフォルトで検索対象のURLがRubyGems.orgに設定されているからです。
次のようにgem sourcesを実行すると、設定されているURLを調べることができます。

ターミナル | デフォルトで設定されているリモートソース
1
2
3
4
5
gem sources

*** CURRENT SOURCES ***

https://rubygems.org/

このようにRubyGems.orgに共有したいgemを登録すると、RubyGems(gemコマンド)を使って簡単にインストールすることができます。

ポイント
  1. RubyGems.orgは、他の開発者に共有するgemを公開することができる
  2. RubyGems(gemコマンド)を使うことで、RubyGems.orgで公開されるgemを簡単にインストールできる

参考:
https://github.com/rubygems/rubygems
https://www.ruby-lang.org/ja/libraries/
https://guides.rubygems.org/publishing/#publishing-to-rubygemsorg

Bundler

Bundlerとは、gemのバージョンや依存関係を管理してくれるgemです。

Bundlerを使うことで、複数人で開発する際にgemのバージョンが上がってもエラーを起こさずに開発できます。Bundlerでは、GemfileとGemfile.lockを使って管理します。

Bundlerの詳細は「結局bundlerって何?図解形式で徹底解説」を参考にしてください。

gemの仕組み

ここまで解説した用語を整理しましょう。

有志の開発者が他の開発者も使えるように開発したライブラリを「外部ライブラリ」と呼びます。機能を使用するには主にインストールと読み込みが必要になります。

外部ライブラリの特徴

そして、外部ライブラリはさまざまなフォルダやファイルで構成されていますが、次のように1つのgemファイルの形式にまとめたファイルのことをgem(gemパッケージ)と呼びます。

gem形式にパッケージングする例

そして、この「gem」は「RubyGems.org」に置くことで、パッケージ管理システムである「RubyGems」を使えば簡単にインストールすることができます。

例えば、次のように田中さんが自作したgemをRubyGems.orgに公開し、そのgemを伊藤さんがインストールしたい場合は、次のような流れになります。

gemアップロードからインストールまでの流れ

  1. 田中さんが自作したgem(my_libs-0.1.0.gem)をRubyGems.orgに公開する
  2. RubyGems.orgにgemを公開すると、他の開発者に共有できるようになる
  3. 伊藤さんがgem install my_libsを実行するだけで、RubyGems.orgから同じ名前のgemを探してインストールすることができる

このようにgem(gemパッケージ)は、RubyGems.orgに公開することではなく、外部ライブラリをgemというファイル形式(.gem)にパッケージングしたものなので誤解しないように気をつけてください。そして、RubyGems.orgに公開することでgem install ~で簡単にインストールができます。

この記事のまとめ

  • gemとは、gem形式にパッケージングされたRuby言語用の外部ライブラリのこと
  • 外部ライブラリとは、有志の開発者が他の開発者も使えるように開発したライブラリのこと
  • 外部ライブラリのフォルダやファイルを1つのgem形式のファイルにパッケージングされたものをgem(gemパッケージ)と呼ぶ

2

わかった!