こんにちは、クラウドハウス労務でバックエンドエンジニアをしている本澤(mottei)です。 本記事では,1日目のHiroshi SHIBATA(@hsbt)さんによるセッション、Long journey of Ruby standard libraryについて紹介させていただきます。
スピーカーのhsbtさんはRubyGemsやbundlerなどのメンテナンスに関わるRubyコミッターです。建設業界向けのSaaSを提供する株式会社アンドパッドに所属されています。余談ですがアンドパッドさんはスポンサーとしてブースを出店されており、おみくじの企画を行なっていました。私もブースにお邪魔させていただきましたが、見事大吉を引き当てることができ、工具セットをいただきました!建設業界ならではの素敵なノベルティでした。
Long journey of Ruby standard library
本題に戻ると今回のRubyKaigiでは、Rubyの標準ライブラリがどのように変遷してきたか、将来どうなっていくかについて講演をなさっていました。
標準ライブラリとは
Rubyをインストールすると、さまざまなライブラリも一緒にインストールされます。標準ライブラリとは、そのうちrequireすることによって利用できるもののことを指します。例えば、jsonやURIなどが標準ライブラリにあたります。requireしなくても利用できるクラスはembedded classと呼ばれます。
Rubyをインストールしたときにともにインストールされる標準ライブラリの数は、Rubyのバージョンによって増減してきました。インストールされる標準ライブラリの数が最も多かったのはバージョン1.8の時でした。当時はインターネットが常時接続ではなかったため、gem installでいちいちインストールするよりはまとめてインストールしてしまった方がよい、という事情があったそうです。
default gems と bundled gems
default gemsは標準ライブラリをgemとしても配布したものです。 default gemsの一覧はhttps://stdgems.org/で確認できます。Ruby本体のバージョンを変更せずともdefault gems単体でバージョンをアップデートできます。
一方bundled gemsについて、非bundlerのプロジェクトについてはgem installしなくとも利用できますが、bundler利用のプロジェクトに関してはGemfileに含めてbundle installしないと利用できません。
最近のRubyはバージョンを増すにつれて、default gemsを減らしてbundled gemsを増やす傾向にあります。
なぜdefault gemsを減らすのか
Rubyがdefault gemsを減らす理由は大きく2つあります。セキュリティ対応とRubyコミュニティのサステナビリティのためです。
gem同士の依存関係が多くなるほどサプライチェーンアタック(依存関係のある別のモジュールを介してセキュリティ攻撃を仕掛けること)の危険性が上昇します。また、依存関係に悩まずにライブラリ単体で開発しやすい環境を作ることで、より多くの人がRubyやgemの開発に関わりやすい環境になります。
Ruby3.3での新機能
とはいえ、default gemsが何の通知も無しにbundled gemsに変わってしまうとbundlerを利用している開発者は困ってしまいます。そのためにRuby3.3では、将来bundler gemsに移行される予定のライブラリを利用しているときに、警告が出る機能が追加されました。これによって、bundlerを利用しているプロジェクトでRubyのバージョンをあげた途端にライブラリが利用できなくなるといったことが起こらなくなります。
また、別のライブラリが間接的にrequireしているライブラリがbundled gemsに移行される予定がある場合は別の警告が出るようになっています。requireしている元のライブラリ名を表示し、そのライブラリに対して修正を求めるような警告が表示されます。
これからの開発
default gemsを減らしていく活動はまだ解決するべき課題が多くあります。警告の表示はrequireメソッドに対して変更を加えているので、BootsnapやZeitwerkなどrequireメソッドをオーバーライドしているライブラリを利用している場合に警告の表示がうまくいかないことがあります。また詳細は割愛しますが、C拡張のライブラリはbundled gemsへの移行が難しいものがあり、Ruby3.4や3.5での解決に向けて開発が行われています。
感想
本セッションはRubyの生みの親であるMatzさんの Ruby is a programmer's best friend.
と言うフレーズを引用して締められます。Rubyistの皆さんがライブラリのインストールなど細かいことに頭を悩ませることなくRubyで楽しく開発ができるよう、今後もRubyGemsやbundlerの開発を続けていきたいとのことです。私はまだまだRuby初心者ですが、いずれはRubyが全てのプログラマーにとってのbest friendになるようなコミットをしたい、そう思わせてくれるような素晴らしい講演でした。
最後に
Techouseでは、社会課題の解決に一緒に取り組むエンジニアを募集しております。 ご応募お待ちしております。 jp.techouse.com