更新日:
【Ruby】 gemの仕組みを図解形式で学ぼう
gemとは、gem形式にパッケージングされたRuby言語用の外部ライブラリのことです。自作では大変な機能もgemを使うことによって簡単に実装することができます。
例えば、次のようなページネーションを実装する場合は各ページに合わせてデータを取得する必要があるので、自作となると少し大変です。
そこで「kaminari」というgemを使うことで、ページネーションを1からプログラム作成することなく簡単に実装することができます。
このようにRubyには便利なgemが豊富に揃っています。
この記事では、gemを理解するための 「用語」や「仕組み」について学んでいきます。
用語を整理しよう
gemは、Rubyでの開発において欠かすことができない存在です。学習している内にいつの間にかgemを使っていた方も多いでしょう。しかし「gemとは一体なんなのか」を調べても、次のように用語がたくさん出てくるのでイメージしにくいですね。
gemとは、gem形式にパッケージングされたRuby言語用の外部ライブラリのこと
そのため、この章ではgemを理解するために用語を1つ1つ整理していきます。
ライブラリとは
まずは「ライブラリ」について解説します。
ライブラリとは、「汎用性の高い機能を他のプログラムで呼び出して使えるように部品化して集めたファイル」のことです。
例えば、次のようなページネーションのライブラリ(kaminari)の場合は、各ページのデータを取得する機能などページネーションでよく使われる便利な機能がまとめられています。
ライブラリは実行ファイルではないので、ライブラリ単体で動作することができません。
そのため、ライブラリは他の実行可能なファイル(プログラム)から呼び出されて機能が使われます。ライブラリの機能は、次のように他のプログラムから呼び出せるように「部品化」されています。
つまり、ライブラリは「他のプログラムに汎用性の高い機能を提供することを前提」として作られた部品の集まりです。
Rubyのライブラリの種類
Rubyには、標準ライブラリ、組み込みライブラリ、外部ライブラリがあります。ライブラリによっては、「インストール」や「読み込み」が必要な場合があります。
各ライブラリの特徴は、以下の表の通りです。
種類 | 説明 | インストール | 読み込み |
---|---|---|---|
標準ライブラリの 組み込みではないライブラリ |
Rubyインストール時に Ruby本体としてインストールされるライブラリ |
不要 | 必要 |
標準ライブラリの 組み込みライブラリ |
Ruby本体に組み込まれるライブラリ(標準ライブラリに属する) | 不要 | 不要 |
外部ライブラリ | 有志の開発者が他の開発者も使えるように開発したライブラリ (※Rubyインストール時に一緒にインストールされるものもある) |
必要 | 必要 |
上記の表にあるように「外部ライブラリ」は有志の開発者が開発したライブラリで、機能を使うには「インストール」と「読み込み」が必要です。
そして、gemは外部ライブラリです。つまりgemを使う場合は「インストール」と「読み込み」が必要ということです。
gem(gemパッケージ)とは
実際には、外部ライブラリはいくつものディレクトリで構成されていますが、Rubyではほとんどの外部ライブラリは、gem形式(名前-バージョン.gem
)という1つのファイルに(パッケージング)まとめられています。
このように外部ライブラリのフォルダやファイルを1つのgem形式のファイルにパッケージングされたものをgem(gemパッケージ)と呼びます。
複数のディレクトリで構成されている外部ライブラリは、1つのファイルにパッケージングすることで他のプログラムに簡単に配布することができます。
外部ライブラリをgem(gemパッケージ)にするメリットとして、RubyGemsというシステムを使うことができます。RubyGemsについては次の章で詳しく解説させていただきます。
RubyGemsとは?
RubyGemsは、(Ruby 1.9 以降から) Rubyインストール時にRuby本体としてにインストールされる「標準ライブラリ」です。 Ruby 1.9以降が使える環境ならば、RubyGemsを使うことができます。
RubyGemsを使うと、主に以下の操作を簡単に行うことができます。
- gemのインストール
- gemのアンインストール
- インストール済みのgemのリストを表示
- 利用可能なgemを検索
この操作を行うには、RubyGemsが提供するgemコマンドを使います。
インストールの場合は、次のようにgem install Gem名
でRuby環境に指定したgemをインストールすることができます。
1
gem install [Gem名]
例えば、moneyというお金の通貨の変換を行ってくれる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の機能を使うには、次のようにirbを起動してrequire
で読み込みます。
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名]
を実行するだけで簡単にアンインストールすることができます。
1
gem uninstall [Gem名]
先ほどインストールした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を管理するパッケージ管理システムといえます。
それでは、gemはどこからインストール/検索することができているのでしょうか。
これを理解するために「RubyGems.org」について学んでいきます。
RubyGems.org
RubyGems.orgはGemの公開リポジトリで、他の開発者に共有するgemを公開することができます。(ソースコードは主にGithubで確認することができます。)
また、公開されたgemの詳細情報を検索することができます。
例えば、先ほどインストールしたmoneyを検索窓に入力して検索すると、次の画面が表示されて詳細情報を得ることができます。
そして、先ほど解説したgemのインストールなど操作を簡単に行える「RubyGems」は、「RubyGems.org」の「クライアント」でもあります。
例えば、Ruby 1.9以降をインストールしたローカル環境下でRubyGemsを使用した場合は、次のようにRubyGems.orgにリクエストが送信されてレスポンスが返ります。
つまり、gam install money
は、RubyGems.orgで公開されているgemを探してインストールしているのです。
これは、デフォルトで検索対象のURLがRubyGems.orgに設定されているからです。
次のようにgem sources
を実行すると、設定されているURLを調べることができます。
1
2
3
4
5
gem sources
*** CURRENT SOURCES ***
https://rubygems.org/
このようにRubyGems.orgに共有したいgemを登録すると、RubyGems(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」は「RubyGems.org」に置くことで、パッケージ管理システムである「RubyGems」を使えば簡単にインストールすることができます。
例えば、次のように田中さんが自作したgemをRubyGems.orgに公開し、そのgemを伊藤さんがインストールしたい場合は、次のような流れになります。
- 田中さんが自作したgem(my_libs-0.1.0.gem)をRubyGems.orgに公開する
- RubyGems.orgにgemを公開すると、他の開発者に共有できるようになる
- 伊藤さんが
gem install my_libs
を実行するだけで、RubyGems.orgから同じ名前のgemを探してインストールすることができる
このようにgem(gemパッケージ)は、RubyGems.orgに公開することではなく、外部ライブラリをgemというファイル形式(.gem)にパッケージングしたものなので誤解しないように気をつけてください。
そして、RubyGems.orgに公開することでgem install ~
で簡単にインストールができます。
手元に置いておきたい1冊
こちらの「プロを目指す人のためのRuby入門」は、Rubyの特徴から例外処理、デバック技法など実務で必要となる知識を一通り学ぶことができます。
豊富なサンプルコードと丁寧な解説でしっかり理解できるように書かれている良書です。
Ruby on Railsは、Rubyで書かれたフレームワークです。Railsで使用される構文はRubyの構文が大半です。そのためRubyをしっかり学習することでRailsへの理解が深まります。
手を動かしながらRubyを学べる丁寧な技術書です!
言語仕様からテスト駆動開発・デバッグ技法まで
この記事のまとめ
- gemとは、gem形式にパッケージングされたRuby言語用の外部ライブラリのこと
- 外部ライブラリとは、有志の開発者が他の開発者も使えるように開発したライブラリのこと
- 外部ライブラリのフォルダやファイルを1つのgem形式のファイルにパッケージングされたものをgem(gemパッケージ)と呼ぶ