esm アジャイル事業部 開発者ブログ

永和システムマネジメント アジャイル事業部の開発者ブログです。

standard librariesとdefault gemsとbundled gemsの違い

日本のハワイ、宮崎よりお送りします。yoshinoです。

先日、XMLでレスポンスを返すAPIがあったので、require 'rexml/document'でロードしてXMLをパースしようとすると、cannot load such file -- rexml/documentが起きてしまう事象に遭遇しました。

Ruby 3.0.0 Releasedによれば、Ruby3.0からrexmlrssはbundled gemになったようです。

このリリース記事では、libraryとして次のような言葉が使われていて、

  • standard libraries ( stdlib files )
  • default gems
  • bundled gems
  • default gemsでもbundled gemsでもないgem (その他のgem )

「具体的に何が違うんだっけ?」となったので、この4つの言葉について調べました。

standard libraries

Ruby 3.0.0 Standard Library Documentation

Ruby standard library (found in lib/ directory of the Ruby source code, or lib/ruby/1.x/ of a Ruby installation)

GitHubのRubyリポジトリruby/libディレクトリ下にあるコードを指すようです。 

default gems

standard librariesの中でgem化されたライブラリを指します。

gem listを実行した時に、csv (default: 3.1.9)のように、defaultが出力されることからも確認することができます。

$ gem list | grep default
abbrev (default: 0.1.0)
base64 (default: 0.1.0)
benchmark (default: 0.1.1)
.
.
.

default gemsは消すことができません。

$ gem uninstall abbrev
Gem abbrev-0.1.0 cannot be uninstalled because it is a default gem

Ruby3.0の時点では、standard librariesのうち88%(101/114)がgem化されていて、standard librariesの開発に依存しないで、Rubyの開発ができるように、残りの部分に関してもgem化が目指されているようです。

Ruby3.0のリリースでも、たくさんのstandard librariesがgem化されたことがアナウンスされています。

The following stdlib files are now default gems and are published on rubygems.org.
English
abbrev
base64
drb
.
.

例えばbase64はRuby3.0からgem化されていることがわかります。

$ ruby -v
ruby 2.7.2p137 (2020-10-01 revision 5445e04352) [x86_64-linux]
$ gem contents base64
Unable to find gem 'base64' in default gem paths
$ ruby -v
ruby 3.0.0p0 (2020-12-25 revision 95aff21468) [x86_64-linux]
$ gem list | grep base64
base64 (default: 0.1.0)

bundled gems

Rubyをインストールした時に一緒にインストールされる点が、その他のgemとは異なります。

例えば、Ruby3.0ではrssはbundled gemになったため、Rubyと一緒にインストールされますが、default gemではないため、後から削除することができます。

$ ruby -v
ruby 3.0.0p0 (2020-12-25 revision 95aff21468) [x86_64-linux]
$ gem list | grep rss
rss (0.2.9)
$ gem uninstall rss
Successfully uninstalled rss-0.2.9

Railsへの影響など

  • bundled gemになったgemはGemfileで指定して、bundle installする必要があります
  • gem化されたstandard libraryは、Gemfileに指定することで、bundlerで管理することができるようになります

リファレンス