世界を動かす技術を、日本語で。

Rv、新しいタイプのRuby管理ツール

概要

  • Bundler開発者 が長年望んでいた 理想的なRuby依存関係管理ツール の構想
  • Pythonのuv がその理想を実現していることを発見し、影響を受ける
  • Rust製の新ツール「rv」 をRuby向けに開発開始
  • Rubyバージョンとgemの 同時管理・高速化・分離実行環境 を実現
  • rvの初期バージョンが公開済み、今後の発展にも期待

Bundler開発者の新たな願いとPython「uv」との出会い

  • Bundler開発者 が長年抱いてきた「より良い依存関係管理ツール」への願い
  • Rubyバージョン管理とgem管理の 一元化ニーズ
  • Rubyのビルド不要、プリコンパイル済みRubyの導入による高速化
  • 任意のRubyスクリプトやCLIツールが 即時・分離された環境 で実行可能な理想
  • こうした機能を実現した Pythonの「uv」 の存在を知り、感銘を受ける

Python「uv」の革新と利用体験

  • uv はpipやpoetryの代替として誕生
  • 既存のPython依存関係管理ツールの機能を 包括的に統合
  • 速度・信頼性・利便性 が非常に高い体験を提供
  • 依存関係の衝突や手動設定によるトラブルの 根本的解消
  • 約1年間uvを利用 し、その優秀さを実感

Ruby向け「rv」の開発決意と主要機能

  • Ruby版uvが存在しないため、 自ら開発を決意
  • cargo、npm、uv の革新を取り入れた新ツール「rv」の構想
  • Rust製 による圧倒的な高速処理
  • rvm installやbundle installに相当する処理を 透過的・高速に自動実行
  • rvx/rv tool run によるCLIコマンドの即時実行・依存関係自動解決
  • 分離環境 でのツール実行により、Rubyやgemのバージョン衝突を回避
  • rv tool install で任意のgemをCLIツール化し、独立した環境でどこでも利用可能
  • スクリプトサポート :.ruby-version、Gemfile、Gemfile.lockの情報をスクリプト1ファイルに集約し、rv run script.rbで即時実行

rvがもたらす新しいRuby開発体験

  • Rubyバージョン管理とgem管理の 完全統合ツール
  • CLIツール、Webアプリ、スクリプト問わず 一貫した環境構築と実行
  • rvm、rubygems、bundler など複数ツールの手動セットアップが不要
  • ただコマンドを実行するだけで 全て自動で環境構築・依存解決
  • 「Language Manager」 という新カテゴリを提唱

開発体制・現状・今後

  • Samuel Giddins (RubyGemsチーム)、 Sam Stephenson (rbenv創始者)がチーム参加
  • zsh上でRubyバージョン自動切替、macOS/UbuntuでRuby 3.4.xの 1秒インストール に成功
  • rvリポジトリ で初期バージョンを公開中
  • 今後の計画や詳細についても 随時情報発信予定
  • 企業向け導入サポート も視野に入れた展開

まとめと呼びかけ

  • Ruby開発体験を大きく変える新ツール「rv」 の登場
  • 従来のバージョン管理・依存管理の煩雑さを一掃
  • 新カテゴリ「Language Manager」 への意見も募集中
  • 興味がある方は rvリポジトリ や今後の情報をチェック推奨
  • 開発者・企業からのフィードバックや協力も歓迎

Hackerたちの意見

これはRubyエコシステムにとって本当に素晴らしい改善のように見えるね。関わった人たちに感謝!プロジェクトごとにgemが分かれているのがちょっと不便だと感じてたから、全プロジェクトで使えるシステムレベルの開発ツールが、Bundler中心の世界では場違いに感じることがあったんだよね。

かっこいいけど、こういうツールはRubyだけ使ってる人には便利かもしれないね。ほとんどのプロジェクトでいくつかのランタイムを管理しなきゃいけないから。何年もasdfを使ってて、最近miseに切り替えたんだけど、これらのツールはRuby用の事前コンパイル済みバイナリをダウンロードしてくれるし、他のほとんどの言語のランタイムも同様にね。ただ、特定の言語に特化した機能の方が良い場合もあるかも。結局、ランダムなプロジェクトのために特定のランタイムの依存関係管理をするツールが必要になって、同じようなフラストレーションに陥るんだよね。asdfとmiseはどちらも.tool-versionsファイルを尊重してるから、何か基準を持ってそっちの方向に進んでほしいな。

その気持ちには同意するよ。自分もasdfを使ってるけど、今の段階でこのプロジェクトへの批判はちょっと不公平だと思う。彼らが話している機能、特にnpxのような機能や、インストーラーの面倒なしにRubyを簡単に実行できるようにすることは、まだ実現されてないからね。再考して、.tool-versionsをRubyのバージョンを定義する場所としてサポートしてほしいな。そうすれば、両方のツールが少し調整すれば並行して使えるようになると思う。

flake.nixファイルとdirenvの.envrcファイルにuse flakeを追加することで、これが解決できたよ。プロジェクトディレクトリにcdすると、そのプロジェクトに必要なツールが、テスト済みの正確なバージョンで揃うんだ。ディレクトリから出ると、ツールは消える。依存関係がちゃんとしてれば(例えば自己修正しないとか、npm界隈ではよくあるけど)、こうやってnpmのpackage-lock.jsonからインポートして、依存関係を追跡するのは結構簡単だよ。お気に入りのLLMにflake.nixファイルを書いてもらうといいよ、結構上手にやってくれるから。個人プロジェクトでは、nvmuvrvmみたいな特定の言語用のツールバージョン管理を全部やめられたし、ffmpegやlameみたいな言語特有のパッケージマネージャー以外からの依存関係を追加するのも楽になったよ。

ちょっと待って、miseでどうやって事前コンパイルされたRubyを手に入れるの?デフォルト設定でコンパイルしなきゃいけないし、ドキュメントにはruby-buildを裏で使ってるってだけしか書いてないんだよね。https://mise.jdx.dev/lang/ruby.html

miseは一部のPython関連のことにuvをバックエンドとして使ってるよ(uvx経由のPythonツールとか)。もしrvuvと同じ方向に進化すれば、miseのRuby関連のデフォルトバックエンドになるかも。asdfから切り替えてから、miseにはすごく満足してるし、uvにも全体的に満足してるよ。相性もいいと思う。

パッケージ管理の改善がフルサークルで進んでいくのを見るのは面白いね。Rubyのパッケージ管理から得た教訓がRustに貢献して、RustがPythonのパッケージ管理を改善する手助けをして、今度はPythonのパッケージ管理がRubyの改善にインスピレーションを与えてるんだもん!

「バージョンマネージャーでも依存関係マネージャーでもないけど、その両方以上のもの。今はこのカテゴリを「言語マネージャー」と呼んでるけど、もっといい名前のアイデアがあったら教えて!」言語オーケストレーター?

Rubyの好きなところの一つは、Pythonみたいに「VM地獄」に陥らなかったことだね。確かに、いろんなRubyのバージョンマネージャーはあるけど、Rubyをインストールする方法に関わらず、バンドラーは一つだけだから。ここにいくつかのアイデアはあるけど、これがPythonの悪夢への第一歩にならないかちょっと心配。

rvは、全く別のエコシステムで比較的明確な勝者からインスピレーションを得るのを待ってたみたいで、かなり違う感じだね。楽観的でいるのは理にかなってると思う。

「私たちは、毎回のbundle execの最初にrvm installとbundle installの両方の同等のものを静かに実行できるようになることを期待しています。」 これって、gemの依存関係ツリーを解決するのにバンドラーのコードを使わず、互換性を持たせるための独自のコードを使うって理解していいのかな?うーん。それに、バンドラーでは結構変動があったGemfile.lockも生成するみたいだけど、みんなが(異なるバージョンの)バンドラーを使ってると仮定しても壊れないようにするのが大変だったよね。

これめっちゃ楽しみ!!Rubyのツールはもう結構いいけど、もっと良くできるはず。貢献してみるつもりだよ。あとは型が必要だね。

型はいらないよ…動的型付けの言語にとっては無意味よりも悪いから。

chrubyやasdfが優雅にやってくれるから、必要ないよ。rvmを防ぐためのNIHみたいだね。

uvはこの10年でPythonエコシステムの中で最高の開発だよ。rvに超ワクワクしてる!お願い、github.comとか他の場所でスポンサーシップを可能にしてほしい。お金を寄付したい!!!

ツールが多ければ多いほどいいね。ありがとう!アイデアとして、rvmやrbenvなどと比較した利点を追加してみては?比較表とかもいいかも。 > Rubyのバージョン: Ruby 3.4.1以上 これって最新のRubyバージョン専用みたいだね :( でも、開発を追いかけるよ!