rtx: Rust製のasdf互換ランタイムマネージャー
asdf
を使っている方はrtx
に乗り換え待ったなしです。
rtx install node@20.0.0 Install a specific version number
rtx install node@20 Install a fuzzy version number
rtx use node@20 Use node-20.x in current project
rtx use -g node@20 Use node-20.x as global default
rtx install node Install the current version specified in .tool-versions/.rtx.toml
rtx use node@latest Use latest node in current directory
rtx use -g node@system Use system node as global default
rtx x node@20 -- node app.js Run `node app.js` with the PATH pointing to node-20.x
魅力
特筆すべきは、.tool-versions
に対応しているのはもちろんのこと、なんとasdf
用のプラグインをそのまま使うことができます。つまり、asdf
向けにプラグインがあるランタイムであればrtx
でもそれをそのまま使えます。しかも速い! READMEによると20〜200倍速いらしいです。
動作原理として、asdf
のように各コマンドをシムするのではなく、シェルインテグレーションを利用してPATH
を更新することで実際のランタイムに解決しているようです。
使い方
インストール
Cargoを使うのが一番わかりやすく、楽で、しかも確実でしょう。
cargo install rtx-cli
環境ごとに上手いことやってくれるシェルスクリプトも提供されています。
curl https://rtx.pub/install.sh | sh
macOSではHomebrewも楽です。
brew install jdxcode/tap/rtx
その他の方法はREADMEを参照してください。
また、シェルインテグレーションも必要です。以下を実行してログインスクリプトに追加してください。
Bashなら:
echo 'eval "$(rtx activate bash)"' >> ~/.bashrc
Zshなら:
echo 'eval "$(~/bin/rtx activate zsh)"' >> ~/.zshrc
Fishなら:
echo 'rtx activate fish | source' >> ~/.config/fish/config.fish
シェルに再ログインし、rtx doctor
を走らせてrtx is not activated, run `rtx activate` for setup instructions
と言われなければ、インストール成功です。
よく使うコマンド
記事冒頭に貼ってある「使用イメージ」はREADMEの“Common commands”からの引用ですが、筆者の使い方(プロジェクトごとにランタイムを使い分けたいだけ)だと、基本的に下記以外の操作は不要だと思いました。cd
の度に自動で適切なランタイムがPATH
に通ります。
.tool-versions
にバージョンを固定
たとえばdeno
なら:
rtx local deno@latest --pin
.tool-versions
にあるバーションをインストール
rtx install
GitHub Actions
asdf
にはasdf-vm/actionsがありましたが、もちろんrtx
にもjdxcode/rtx-actionがあります。
筆者は個人的にしばらく(3ヶ月くらい)使ってみましたが、asdf
時代に経験していたシムによる問題(頻繁にasdf reshim
していた)や、アップデートのたびにシェルインテグレーションが壊れる問題(今は解決しているようですが)などに悩まされることがなくなり、この上なく快適です。
また、deno install
などによるグローバルインストールもしっかりとランタイムバージョンごとに切り分けられていてPATH
が異なるので、Fishシェル上で存在しないコマンドをタイプするとしっかり「存在しないときの色」になってとてもわかりやすい。asdf
だとシムファイルが残っているので、実行しない限り存在するかどうかわかりませんでした。
ただ一つ問題があるとすれば、rtx
というワードのググラビリティーが2しかないことくらいです。
草草
Discussion
rtx
から、mise
にリネームしたみたいですググラビリティも上がったので、良さそうですね