あひるの勉強部屋

つらつらつら~と不定期にカキコするブログ

gettext 3.4.1とruby 3.1.0での対応覚書

どんな問題が起きて、どう調べたか忘れてもいいようにメモ。

やったこと

ruby 3.1.0環境でmikutterを初めて起動してみたときに以下のエラーが発生した。

/home/ahiru/work/mikutter/mikutter/vendor/bundle/ruby/3.1.0/gems/gettext-3.4.1/lib/gettext/mo.rb:178:in `require': cannot load such file -- mathn (LoadError)
        from /home/ahiru/work/mikutter/mikutter/vendor/bundle/ruby/3.1.0/gems/gettext-3.4.1/lib/gettext/mo.rb:178:in `next_prime'
        from /home/ahiru/work/mikutter/mikutter/vendor/bundle/ruby/3.1.0/gems/gettext-3.4.1/lib/gettext/mo.rb:217:in `save_to_stream'
        from /home/ahiru/work/mikutter/mikutter/vendor/bundle/ruby/3.1.0/gems/gettext-3.4.1/lib/gettext/mo.rb:292:in `block in save_to_file'
        from /home/ahiru/work/mikutter/mikutter/vendor/bundle/ruby/3.1.0/gems/gettext-3.4.1/lib/gettext/mo.rb:292:in `open'
        from /home/ahiru/work/mikutter/mikutter/vendor/bundle/ruby/3.1.0/gems/gettext-3.4.1/lib/gettext/mo.rb:292:in `save_to_file'
        from /home/ahiru/work/mikutter/mikutter/vendor/bundle/ruby/3.1.0/gems/gettext-3.4.1/lib/gettext/tools/msgfmt.rb:58:in `run'
        from /home/ahiru/work/mikutter/mikutter/vendor/bundle/ruby/3.1.0/gems/gettext-3.4.1/lib/gettext/tools/msgfmt.rb:38:in `run'
        from /home/ahiru/work/mikutter/mikutter/plugin/uitranslator/uitranslator.rb:37:in `block in spec='
        from /home/ahiru/work/mikutter/mikutter/plugin/uitranslator/uitranslator.rb:34:in `each'
        from /home/ahiru/work/mikutter/mikutter/plugin/uitranslator/uitranslator.rb:34:in `spec='
        from /home/ahiru/work/mikutter/mikutter/core/miquire_plugin.rb:156:in `block (2 levels) in load'
        from /home/ahiru/work/mikutter/mikutter/vendor/bundle/ruby/3.1.0/gems/pluggaloid-1.7.0/lib/pluggaloid/plugin.rb:39:in `instance_eval'
        from /home/ahiru/work/mikutter/mikutter/vendor/bundle/ruby/3.1.0/gems/pluggaloid-1.7.0/lib/pluggaloid/plugin.rb:39:in `create'
        from /home/ahiru/work/mikutter/mikutter/core/miquire_plugin.rb:155:in `block in load'
        from /home/ahiru/work/mikutter/mikutter/core/utils.rb:288:in `block in atomic'
        from /home/ahiru/work/mikutter/mikutter/core/utils.rb:288:in `synchronize'
        from /home/ahiru/work/mikutter/mikutter/core/utils.rb:288:in `atomic'
        from /home/ahiru/work/mikutter/mikutter/core/miquire_plugin.rb:147:in `load'
        from /home/ahiru/work/mikutter/mikutter/core/miquire_plugin.rb:149:in `block (2 levels) in load'
        from /home/ahiru/work/mikutter/mikutter/core/miquire_plugin.rb:148:in `each'
        from /home/ahiru/work/mikutter/mikutter/core/miquire_plugin.rb:148:in `block in load'
        from /home/ahiru/work/mikutter/mikutter/core/utils.rb:288:in `block in atomic'
        from /home/ahiru/work/mikutter/mikutter/core/utils.rb:288:in `synchronize'
        from /home/ahiru/work/mikutter/mikutter/core/utils.rb:288:in `atomic'
        from /home/ahiru/work/mikutter/mikutter/core/miquire_plugin.rb:147:in `load'
        from /home/ahiru/work/mikutter/mikutter/core/miquire_plugin.rb:99:in `block in load_all'
        from /home/ahiru/work/mikutter/mikutter/core/miquire_plugin.rb:40:in `block in each_spec'
        from /home/ahiru/work/mikutter/mikutter/core/miquire_plugin.rb:35:in `each'
        from /home/ahiru/work/mikutter/mikutter/core/miquire_plugin.rb:35:in `each'
        from /home/ahiru/work/mikutter/mikutter/core/miquire_plugin.rb:38:in `each_spec'
        from /home/ahiru/work/mikutter/mikutter/core/miquire_plugin.rb:98:in `load_all'
        from /home/ahiru/work/mikutter/mikutter/core/boot/load_plugin.rb:14:in `<top (required)>'
        from mikutter.rb:55:in `require'
        from mikutter.rb:55:in `<main>'

mikutterのuitranslatorプラグインがgettextを使っている箇所で依存がないと怒っているらしい。 最初はあまりコードを追わずに mathn を依存に追加してみたが、最終的に prime を追加しないと動かなかった。(ここがすでにあやふや)
ここで一旦問題が発生している箇所のコードを読んだが、 mathn のロードはフォールバック処理だった。そもそも prime が呼び出せていないのがおかしい気がする。 他のmikutter開発者は特に言及していないのと依存しているgettextは直近で更新されていなかったので環境依存かrubyのバージョンかを疑い始めた。
この時shibafu528氏がruby 3.1.0で再現できたということでrubyのバージョン依存の問題ということで調査を進めることにした。(ありがとう shibafu528) ちなみにrubyを3.0.3にしたところ問題なく動作した。

ruby 3.0.3と3.1.0周りで何か起きているのかと調べたところ、以下のstackoverflowの質問がヒットした。

stackoverflow.com

エラーの内容的にもrubyのバージョン的にも同じであるため、かなり近づいた気がした。 Answerのリンクに下記が示されていた。

github.com

PRのタイトルに Add former default gems as a dependency for Ruby 3.1 compatibility とあるからして、どうやら予想のとおり 3.1.0 では何かしら変わったようだ。 PRのリンクを更に追うと RubyRedmineにたどり着いた。

bugs.ruby-lang.org

この時点でdefault gemとbundled gemについては知らなかったが、示されているリストに prime が入っているのでかなり答えに近づいていると思い読み進めた。
とはいえ読み進めるにあたりdefault gemとbundled gemについて大雑把でいいので知りたかったので以下のブログを参考にした。

zenn.dev

gemの種類の違いをざっと把握したところで、今までのリンクの情報をまとめたところ状況が理解できた。
3.1.0からはgettextの依存しているprimeがdefault gemからbundled gemになったため明示的に依存を宣言しないと使えないということだった。

ここでとりあえずmikutterのRedmineに問題の報告をした。

dev.mikutter.hachune.net

今にして思えば最初のエラー発生時にとりあえずチケットを切っておくべきだったと反省している。

そこから数日後にruby-gettextにissue報告をしたところ速攻で対応していただき、対応済みのgettext 3.4.2を出していただいた。

後は mikutter 側に新しい3.4.2を使うチケットを投げて終わり。(イマココ)

まとめ

gemの種類の違いについて知ることができたのと、最近mikutterに貢献できていなかったので貢献できたのがいい点。
課題として次はもっと早く報告をできるようにしたい。

追記

default gemやbundled gemについては Ruby Standard Gems を見ればいいっぽい。