日本のハワイ、宮崎よりお送りします。yoshinoです。
先日、XMLでレスポンスを返すAPIがあったので、require 'rexml/document'
でロードしてXMLをパースしようとすると、cannot load such file -- rexml/document
が起きてしまう事象に遭遇しました。
Ruby 3.0.0 Releasedによれば、Ruby3.0からrexml
とrss
は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で管理することができるようになります