PythonのuvライクなRuby用インストーラーのrvについて
GA technologiesでソフトウェアエンジニアをしている中坂です。
最近よく使われるようになっているPythonのパッケージ&プロジェクトマネージャーにuvがあります。pipの代替として作られたものでRustで実装されています。uvはRustでいうところのcargoのような、プロジェクトマネージメントやスクリプト実行の責務まで包含した総合的な開発ツールという位置づけです。
rvはこのuvのRuby版に相当するものです。
開発者はbundlerの作者でありメンテナーをやっていたAndré Arko氏。氏はRuby/Rails関連のOSSでメンテナーをやっている人たちが集まっているSPINELというチームの一員です。このチームはGEOMYSにインスパイアされたOSSのメンテナ集団らしいです。こういうOSSメンテナによる技術チームみたいなものを作るムーブメントがあったことを初めて知りました。
bundlerの作者がuvにインスパイアされて作ったというツールということで興味が沸いたので調べてみました。
rvのインストール
READMEにしたがって、homebrewでinstallしてみます。
$ brew install rv
$ echo 'eval "$(rv shell init zsh)"' >> ~/.zshrc
$ eval "$(rv shell init zsh)"
Rubyのインストール
まずは適当なRubyのバージョンをインストールしてみます。
$ echo "3.4.5" > .ruby-version
$ time rv ruby install 3.4.5
Installed Ruby version ruby-3.4.5 to /Users/sample_user/.rubies
rv ruby install 3.4.5 0.32s user 0.84s system 46% cpu 2.478 total
Rubyのインストールの速さを売りにしているだけあって、ほんの数秒でインストールが終わりました。
homeディレクトリに.rubies
ができています。.rubies
の中身を見てみましょう。
$ tree ~/.rubies -a -L 2 -I ".*"
/Users/sample_user/.rubies
└── ruby-3.4.5
├── COPYING
├── COPYING.ja
├── ChangeLog
├── INSTALL_RECEIPT.json
├── NEWS.md
├── README.md
├── bin
├── include
├── lib
├── libexec
├── sbom.spdx.json
└── share
ruby-major.minor.patch
というバージョンでディレクトリができているようです。
では別のバージョンもインストールしてみます。
$ rv ruby install 3.4.3
$ ls -la ~/.rubies
ruby-3.4.3
ruby-3.4.5
他のバージョンもこんな感じで~/.rubies
に並列にインストールされていく流れになっています。
速さのカラクリ
rvはspinel-coop/rv-rubyからビルド済みのバイナリを落としてきています。つまりruby-buildのようなビルドツールを使っていません。
tar.gz形式で圧縮されたビルド済みバイナリをダウンロードして展開するだけなので速いわけです。
しかしバイナリということはビルド先のプラットフォームには制限があるのでは?と思い調べたところ、やはり対応プラットフォームは限られていました。Windowsには対応していません。おそらく現状はほぼPoCなので必要最小限のものだけにしているのだと思います。
-
arm64_sonoma
(M1/M2 Mac) x86_64_linux
arm64_linux
一応名誉のために書いておきますが、一度DLしたtar.gzはキャッシュしていたり、rayonというRustのイテレータを簡単に並列処理にしてくれるcrateを使ってローカルのRubyのtar.gzの検索を高速にする工夫などもされています。
その他の機能
Rubyの高速なインストール、rvはまだこの機能のみです(一部list
やenv
コマンドなどはあります)。なので現状rvはRustで実装されたRubyのビルド済みバイナリインストーラーにすぎません。
ただし、PLANS.mdをみると今後の開発計画が書かれており、なかなか野心的なのでいくつかピックアップしてみます。
- rvm, rbenv, chruby, asdf, mise, ruby-build, ruby-install, bundler, rubygems を置き換えてパッケージマネージャではなく統合開発ツールにする
- 複数バージョン切り替えはもちろん完備
-
rv tool install hoge
のような感じで隔離された環境を作る - gemのインストールもRuby同様高速にインストールする
-
KDLを用いた
rbproject.kdl
というファイルでプロジェクトやバージョンなどの全てのコンフィグファイルをまとめる -
rv run script.rb
のような形式でスクリプト実行をした際に、まだインストールされていないgemがあっても自動で隔離された環境にインストールして実行できるようにする
等々、Ruby本体にバンドルされたらなかなか便利そうです。ただし、どれもまだまだ構想段階で実装されていない状態になっています。
最後に
bundlerの作者がuvライクなRubyのインストーラーを作ったということで実際にどんなものか試してみました。
まだRubyを高速にインストールするという機能しかないものの、今後の構想は野心的で面白いです。
Hacker Newsではmiseでいいのでは?とか現状に困っていないという意見がもちろん多いですが、miseはRubyのinstallにruby-buildを使っているので、個人的にはそのバックエンドにrvが使われると少し嬉しいのでは?と思ったりもします。
まだまだ開発が始まったばかりなので業務でいきなり導入するようなフェーズではないですが、今後の開発には注目したいです。
GA technologiesではこのようにRubyやRailsに関するライブラリやツールを使った開発が好きなソフトウェアエンジニアを求めています。もし興味があれば下記のリンク、もしくは私のXのアカウントまでご連絡ください。
Discussion