はじめに
この記事はUdon Advent Calendar 2025 - Adventarの11日目の記事です。
RubyのGem
9日目の記事でRubyの環境構築について解説しました。その後半でGemについての話にも触れたと思います。
今回の記事では、RubyのGemについてもう少し掘り下げてみようと思います。
Gemとは
Gemとはgem形式にパッケージングされたRuby用のライブラリの総称です。
ある機能を作りたいときに一から実装するのは大変ですが、ライブラリを使うことでそういった機能をすぐに使うことができます。別プログラムで同じことがしたいなら同じライブラリを使えばいいので、再現性も高くなります。
GemはRubyGemsによって管理されます。Pythonで言うpipですね。
Gemの種類
Gemは大きく分けて二種類あります。
標準ライブラリ
Rubyのインストール時に同時にインストールされるGemです。Rubyのバージョンごとに
Rubyをインストールしたら、以下のコマンドを実行してみましょう。
gem list
そうすると、以下のように現在あるGemがリストアップされます(Ruby3.4.7の場合)。
$ gem list
*** LOCAL GEMS ***
abbrev (0.1.2)
base64 (0.2.0)
benchmark (default: 0.4.0)
bigdecimal (3.1.8)
bundler (default: 2.6.9)
cgi (default: 0.4.2)
csv (3.3.2)
date (default: 3.4.1)
debug (1.11.0)
delegate (default: 0.4.0)
did_you_mean (default: 2.0.0)
digest (default: 3.2.0)
drb (2.2.1)
english (default: 0.8.0)
erb (default: 4.0.4)
error_highlight (default: 0.7.0)
etc (default: 1.4.6)
fcntl (default: 1.2.0)
fiddle (default: 1.1.6)
fileutils (default: 1.7.3)
find (default: 0.2.0)
forwardable (default: 1.3.3)
getoptlong (0.2.1)
io-console (default: 0.8.1)
io-nonblock (default: 0.3.2)
io-wait (default: 0.3.2)
ipaddr (default: 1.2.7)
irb (default: 1.14.3)
json (default: 2.9.1)
logger (default: 1.6.4)
matrix (0.4.2)
minitest (5.25.4)
mutex_m (0.3.0)
net-ftp (0.3.8)
net-http (default: 0.6.0)
net-imap (0.5.8)
net-pop (0.1.2)
net-protocol (default: 0.2.2)
net-smtp (0.5.1)
nkf (0.2.0)
observer (0.1.2)
open-uri (default: 0.5.0)
open3 (default: 0.2.1)
openssl (default: 3.3.0)
optparse (default: 0.6.0)
ostruct (default: 0.6.1)
pathname (default: 0.4.0)
power_assert (2.0.5)
pp (default: 0.6.2)
prettyprint (default: 0.2.0)
prime (0.1.3)
prism (default: 1.5.1)
pstore (default: 0.1.4)
psych (default: 5.2.2)
racc (1.8.1)
rake (13.2.1)
rbs (3.8.0)
rdoc (default: 6.14.0)
readline (default: 0.0.4)
reline (default: 0.6.0)
repl_type_completor (0.1.9)
resolv (default: 0.6.2)
resolv-replace (0.1.1)
rexml (3.4.0)
rinda (0.2.0)
rss (0.3.1)
ruby2_keywords (default: 0.0.5)
securerandom (default: 0.4.1)
set (default: 1.1.1)
shellwords (default: 0.2.2)
singleton (default: 0.3.0)
stringio (default: 3.1.2)
strscan (default: 3.1.2)
syntax_suggest (default: 2.0.2)
syslog (0.2.0)
tempfile (default: 0.3.1)
test-unit (3.6.7)
time (default: 0.4.1)
timeout (default: 0.4.3)
tmpdir (default: 0.3.1)
tsort (default: 0.2.0)
typeprof (0.30.1)
un (default: 0.3.0)
uri (default: 1.0.4)
weakref (default: 0.1.3)
yaml (default: 0.4.0)
zlib (default: 3.2.1)
HashやArrayなども標準ライブラリですが、これらはrequireなしでも使えます。これはRuby本体としてインストールされている「組み込みライブラリ」です。その証拠に、上記のリストには入っていません。
これらのライブラリはrequireを用いることでプログラム内で利用することができます。例としてjsonを利用してみましょう。サンプルは以下の通り。
require "json"
p JSON.parse('{"name": "Test"}')
JSONのparseメソッドは、文字列として受け取ったjsonをハッシュに変換してくれるものです。
実行すると、以下のようになります。
$ ruby example.rb
{"name" => "Test"}
また、組み込みライブラリではありません(上記リストに入っています)が、timeはよく使われるからなのかrequireしなくても最初から使えます(明示的にrequireしてもOK)。
$ irb
irb(main):001> puts Time.now
2025-12-11 13:14:00 +0900
=> nil
外部ライブラリ
外部ライブラリはいきなり使うことはできず、使う前にインストールが必要なライブラリです。
インストールは以下のように行います。記法はaptに似ていますね。
gem install [name]
nokogiri(例)
HTMLやXMLを解析しパースする機能を持つライブラリです。スクレイピングの際によく利用されます。
サンプルはこんな感じ。標準ライブラリと同様に利用前にはrequireが必要です。
require 'nokogiri'
html = '<div><p>Hello World</p></div>'
doc = Nokogiri::HTML(html)
puts doc.css('p').text # => Hello World
GemをBundlerで管理する
Gemをグローバルにインストールするだけでなく、プロジェクトごとに使うGemの種類やバージョンを管理したいときがあります。特に他のGemに依存しているGemを使う際は依存関係もしっかりと管理しなくてはなりません。
そんな時に便利なのがBundlerというGemです。これはGemのバージョンをディレクトリごとに
rbenvのRubyバージョン機能と組み合わせることで多彩な仮想環境を用意することができます!
Gemfile
Bundlerは以下のようなGemfileを利用してGemのバージョン管理を行います。これが含まれているパス以下がバージョン管理の対象となります。
source "https://rubygems.org"
gem "nokogiri"
どこからダウンロードするのかを明記した後、gem "[name]"の形式で必要なGemを列挙します。
インストールするGemのバージョンを以下のように細かく指定することもできます。
gem "nokogiri", "~> 1.18" # 1.18以降の互換性のあるバージョンを指定
gem "nokogiri", ">= 1.18.10" # 最低でも1.18以上のバージョン
今回は以下のように1.18.9を狙ってインストールしてみます。これによってグローバルにインストールしたnokogiriと区別します。
gem "nokogiri", "1.18.9"
準備できたら、以下のコマンドで指定したGemをインストールします。
bundle install
$ bundle install
Fetching gem metadata from https://rubygems.org/.......
Resolving dependencies...
Bundle complete! 1 Gemfile dependency, 3 gems now installed.
Use `bundle info [gemname]` to see where a bundled gem is installed.
実行後、Gemfile.lockというファイルができています。ファイルの中には依存関係が記入されています。raccというGemに依存しているようですね。
各ライブラリのどのバージョンがインストールされたのか、という情報も載っています。
GEM
remote: https://rubygems.org/
specs:
nokogiri (1.18.9-aarch64-linux-gnu)
racc (~> 1.4)
nokogiri (1.18.9-aarch64-linux-musl)
racc (~> 1.4)
nokogiri (1.18.9-arm-linux-gnu)
racc (~> 1.4)
nokogiri (1.18.9-arm-linux-musl)
racc (~> 1.4)
nokogiri (1.18.9-arm64-darwin)
racc (~> 1.4)
nokogiri (1.18.9-x86_64-darwin)
racc (~> 1.4)
nokogiri (1.18.9-x86_64-linux-gnu)
racc (~> 1.4)
nokogiri (1.18.9-x86_64-linux-musl)
racc (~> 1.4)
racc (1.8.1)
PLATFORMS
aarch64-linux-gnu
aarch64-linux-musl
arm-linux-gnu
arm-linux-musl
arm64-darwin
x86_64-darwin
x86_64-linux-gnu
x86_64-linux-musl
DEPENDENCIES
nokogiri (= 1.18.9)
CHECKSUMS
nokogiri (1.18.9-aarch64-linux-gnu) sha256=5bcfdf7aa8d1056a7ad5e52e1adffc64ef53d12d0724fbc6f458a3af1a4b9e32
nokogiri (1.18.9-aarch64-linux-musl) sha256=55e9e6ca46c4ad1715e313f407d8481d15be1e3b65d9f8e52ba1c124d01676a7
nokogiri (1.18.9-arm-linux-gnu) sha256=fe611ae65880e445a9c0f650d52327db239f3488626df4173c05beafd161d46e
nokogiri (1.18.9-arm-linux-musl) sha256=935605e14c0ba17da18d203922440bf6c0676c602659278d855d4622d756a324
nokogiri (1.18.9-arm64-darwin) sha256=eea3f1f06463ff6309d3ff5b88033c4948d0da1ab3cc0a3a24f63c4d4a763979
nokogiri (1.18.9-x86_64-darwin) sha256=e0d2deb03d3d7af8016e8c9df5ff4a7d692159cefb135cbb6a4109f265652348
nokogiri (1.18.9-x86_64-linux-gnu) sha256=b52f5defedc53d14f71eeaaf990da66b077e1918a2e13088b6a96d0230f44360
nokogiri (1.18.9-x86_64-linux-musl) sha256=e69359d6240c17e64cc9f43970d54f13bfc7b8cc516b819228f687e953425e69
racc (1.8.1) sha256=4a7f6929691dbec8b5209a0b373bc2614882b55fc5d2e447a21aaa691303d62f
BUNDLED WITH
4.0.0
また、下の方にはどのバージョンのBundlerでインストールされたか、の情報も書いてあります。
この管理されたバージョンでRubyプログラムを実行してみましょう。サンプルとして以下のRubyファイルを利用します。requireした外部ライブラリのバージョンを出力するというものです。
require 'nokogiri'
puts Nokogiri::VERSION
Bundleを使ってRubyを実行する時は以下のようにします。
bundle exec ruby example.rb
結果は以下の通りです。1.18.9が出てきました。
$ bundle exec ruby example.rb
1.18.9
逆に、以下のようにやるとグローバルなGemが参照されます。
ruby example.rb
実行すると、グローバルの方のバージョンになりました。
$ ruby example.rb
1.18.10
こうして、ライブラリに関しても仮想環境を用意することができました。Gemfileを共有しておくと別のマシンでも同じ環境が作れるのでチーム内で足並みを揃えることができます。
おわりに
Gemを使いこなすことで、Rubyでできることが格段に増えます。
皆さんも標準のGemだけでなく、外部Gemもどんどん利用してみてください!
それではまた、明日の記事でお会いしましょう!
参考文献
【Ruby】 gemの仕組みを図解形式で学ぼう | Pikawaka