👟

rtx: Rust製のasdf互換ランタイムマネージャー

2023/06/29に公開1

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