«前の日記(2020-04-29) 最新 編集

meta's blog - The Power To Serve

筆者について

FreeBSDを通じてOSSにささかな貢献を。HTTPS化したいとは思っているんです…

OSS活動をご支援いただける方を募集しています


2020-05-19 ruby-buildのバージョンリスト表示を整理した [長年日記]

ruby-buildのバージョンリスト表示を整理した

すでにお気づきの方もいるかもしれませんが、昨日リリースされた ruby-build v20200518 では rbenv version -l で表示されるインストール可能なRubyバージョンのリストが大きく整理しされ、短くなりました。

これは私が2020年に入って取り組んでいたもので、多くの人にとって使い勝手の向上となる変更であると信じています。ここでは、当該機能を実装したプルリクエスト rbenv/ruby-build#1402 で改善した内容を解説します。

改善したこと: rbenv install -l の出力を整理した

ruby-build v20200518 以降では、rbenv install -l で出力されるバージョンのリストが以下のように大変スッキリした短いものになりました。以下のようなルールで、現在サポートされている系列の最新バージョンが表示されます。

  • MRIはセキュリティメンテナンス期間を含むサポート中の各マイナーリリースの最新を表示
  • それ以外のRuby実装は最新バージョンのみ表示
$ rbenv install -l
2.5.8
2.6.6
2.7.1
jruby-9.2.11.1
maglev-1.0.0
mruby-2.1.0
rbx-4.15
truffleruby-20.0.0

Only latest stable releases for each Ruby implementation are shown.
Use 'rbenv install --list-all' to show all local versions.

最後の3行は標準エラー出力へ出力されているので、実質的なリスト部分は8行です。

上記のリストに表示されていないバージョンも、非表示になっているだけでインストールは可能です。

$ rbenv install 2.7.0

背景: rbenv install -l 長すぎ問題

本機能を実装するに至った背景を解説します。

従来のruby-buildでは、ruby-buildを使ってインストールできるすべてのバージョンのRubyを表示していました。

$ rbenv install -l | head -n 5 
1.8.5-p52
1.8.5-p113
1.8.5-p114
1.8.5-p115
1.8.5-p231
(中略)
truffleruby-19.2.0.1
truffleruby-19.3.0
truffleruby-19.3.0.2
truffleruby-19.3.1
truffleruby-20.0.0

過去のすべてのバージョンが含まれるリストは大変長くなっていて、2020年5月19日現在で489行にもなります。

$ rbenv install -l | wc -l
     489

このため、多くの人はruby-buildでインストールできるRubyのリストを、lessに渡すか、ターミナルをスクロールバックする等して、500行弱のリストからインストールしたい目的のバージョンを探していたのではないでしょうか。

あるいは、リストを見ずに rbenv install 2.7.1 などと実行して、該当するバージョンがなければruby-buildのアップデートをするという方もいるかもしれません。

rbenv install -l で表示されているリストが過去のすべてのバージョンを含んでいることにより、以下のような問題がありました。

  • 多くの人は最新あるいは少し前のバージョンのRubyしかインストールしない
  • ほとんどの人によって必要とされていないバージョンがリストの大部分を占めている
  • 必要なバージョンを見るためにスクロールが必要で煩わしい
  • バージョンのリストは将来にわたって際限なく増え続ける

ruby-buildでインストールできるRubyのバージョンが、50や100だった頃はすべてのバージョンを表示していてもよかったのですが、500近くになっている現在では整理が必要ではないかという提案を行いました。

互換性への配慮

ruby-buildをバージョンアップして突然 rbenv install -l の出力が短くなっているとびっくりするでしょうから、サポート中のリリースのみを表示している旨のメッセージを表示するようにしました。また、メッセージはリストを machine readable に保つため標準エラー出力へ出力しリスト自体と混ざらないようにしています。


Only latest stable releases for each Ruby implementation are shown.
Use 'rbenv install --list-all' to show all local versions.

過去のバージョンを含んだすべてのバージョンを表示したい場合は rbenv install --list-all というオプションで実行します。大文字の -L というオプションはエイリアスです。

$ rbenv install --list-all / -L

1.8.5-p52
1.8.5-p113
1.8.5-p114
1.8.5-p115
1.8.5-p231
(中略)

ruby-build コマンドはrbenv installよりスクリプトの中でとして実行されることが多いため、こちらの動作は変更せず --list オプションを追加してサポート中のバージョンのみを表示するようにしました。

まとめ

ruby-build v20200518 では、以下のようにコマンドの仕様が変更されています。毎回 less を挟んだりスクロールするという手間がなくなり、多くの人の「ひと手間」を削減する改善となっているはずです。

コマンド オプション バージョンリスト 仕様変更 新規追加
rbenv install -l / --list サポート中のみ
rbenv install -L / --list-all すべて
ruby-build --definitions すべて
ruby-build -l / --list サポート中のみ

現状MRI以外のRuby実装はマイナーリリースを考慮せず、最新バージョンのみを表示するという実装となっていますが、これは「とりあえずこれでいいだろう」とコミュティティで合意したものです。しかし、強い理由があって決まったものではないので、マイナーリリースまで表示してほしいという要望があれば更に改善の余地はあります。