📌

rtxで複数のプログラミング言語のバージョン管理を楽にやろう!

2023/12/03に公開

rtxとは?

複数のプログラミング言語のバージョン管理ができます。
asdfの上位互換でそのまま乗り換えることができます。

asdfを知らない方はnvm、nodenv、pyenvなどのバージョン管理ツールをプログラミング言語ごとに使い分けていたものが1つのツールだけで管理できるものと思ってください。
しかも、それらのツールの設定ファイル(.node-version.python-version.ruby-versionなど)にもだいたい対応しています。

※asdfのプラグインを内部的に利用しているため、残念ながらWindowsにはまだ対応していません(WSL2使えば可能ですが)。

※以下、プログラミング言語の特定のバージョンのことをランタイムとかツールと呼んだりします。

何故rtxを使うのか

まず、nvmやpyenvなどと比較すると、複数プログラミング言語に対して1つのツールだけで管理できる点が便利です。インストールの手間もかからないし、開発環境が汚れにくいです。rtxより使いやすいツールが現れたとしてもアンインストールするのはrtxだけで済みます。
CLIの使い方を覚えるのも設定ファイルの書き方を覚えるのもrtxだけで済みます。

さらに上記のメリットだけであればasdfでも達成できるのですが、asdfと比較して圧倒的に速いです。
何故ならasdfはシェルスクリプトで実装されてますが、rtxはRustで記載されています。公式によると20〜200倍程度速いとのことです。
私は以前はasdfを使用していましたが、ターミナルにstarshipを使っているので、asdfだと実行速度が遅すぎてそこそこラグがあり、動作がモッサリしてました。rtxに変更してからは全く気にならないです。

さらに、asdfと違って最初からインストールされているプラグインがそこそこ多いです。
以下のプラグインはrtxでは最初から組み込まれています。

  • Python
  • NodeJS
  • Ruby
  • Go
  • Java
  • Deno (experimental)
  • Bun (experimental)

さらにasdfがデフォルトで対応していないaliasの機能やvirtualenvの機能まであります。

他にもasdfと比較してdotenvのように環境変数を設定するという機能もあるのですが、こちらはプロジェクト全体でrtxに統一していない場合はイマイチ便利さを受容できないかもなと思うため、今回は説明を省きます。
いまどきのフレームワークは.envファイルを自動で認識してくれたりするので、そこまで恩恵もないかなと思います。

インストール方法

インストール方法は公式を参照してください。

https://github.com/jdx/rtx/blob/main/README.md#installation

主なコマンド

私が良く使うと感じているコマンドをいくつか解説します。

ls-remote

インストール可能なランタイムのバージョンを表示します。
使用例は以下のようになっています。

$ rtx ls-remote node
18.0.0
20.0.0

$ rtx ls-remote node@20
20.0.0
20.1.0

$ rtx ls-remote node 20
20.0.0
20.1.0

$ rtx ls-remote java@corretto-11
corretto-11.0.15.9.1
corretto-11.0.16.8.1

install

ランタイムをインストールします。
使用例は以下のようになっています。

$ rtx install node@20.0.0  # 特定のnodeのバージョンをインストールする
$ rtx install node@20      # ファジーマッチングでnodeをインストールする
$ rtx install node         # .tool-versionsか.rtx.tomlで指定されているバージョンのnodeをインストールする
$ rtx install              # .toolーversionsか.rtx.tomlで指定されているツールをまとめてインストールする

ls

インストール済みか現在選択されているツールのバージョンを表示します。
使用例は以下のようになっています。

$ rtx ls
node    20.0.0 ~/src/myapp/.tool-versions latest
python  3.11.0 ~/.tool-versions           3.10
python  3.10.0

$ rtx ls --current
node    20.0.0 ~/src/myapp/.tool-versions 20
python  3.11.0 ~/.tool-versions           3.11.0

use

使用しているツールのバージョンを変更します。
使用例は以下のようになっています。

$ rtx use node@20
$ rtx use -g node@20

設定

基本的には.rtx.tomlというファイルに設定を記載していきます。
これをgitで管理することでプロジェクト内でのツールのバージョンなどを揃えることができます。

以下に一例を示します。

[env]
# supports arbitrary env vars so rtx can be used like direnv/dotenv
NODE_ENV = 'production'

[tools]
# specify single or multiple versions
terraform = '1.0.0'
erlang = ['23.3', '24.0']

# supports everything you can do with .tool-versions currently
node = ['16', 'prefix:20', 'ref:master', 'path:~/.nodes/14']

# send arbitrary options to the plugin, passed as:
# RTX_TOOL_OPTS__VENV=.venv
python = {version='3.10', virtualenv='.venv'}

[plugins]
# specify a custom repo url
# note this will only be used if the plugin does not already exist
python = 'https://github.com/jdx/rtx-python'

[settings] # project-local settings
verbose = true

[alias.node] # project-local aliases
my_custom_node = '20'

また、グローバルな設定は~/.config/rtx/config.toml内に記載します。

tools

.rtx.toml内のtoolsテーブルでインストールするランタイムのバージョンを指定します。

[tools]
node = '20'
python = '3.10'

env

環境変数もセットできます。

[env]
NODE_ENV = 'production'

また、env_file で指定したファイルの環境変数を読み込むこともできます。
※こちらはenvテーブル内ではなくトップレベルで記載してください。

env_file = '.env'

alias

rtxはaliasもデフォルトでサポートしています。

[alias.node]
my_custom_20 = '20'

利用可能なファイル名

asdfで利用できる.tool-versionsをそのまま利用することができます。

他のツールで利用されているファイルも読み込んでくれます。
プラグインとそれが読み込んでくれるファイルの対応は以下のようになっています。

プラグイン ファイル名
crystal .crystal-version
elixir .exenv-version
go .go-version, go.mod
java .java-version, .sdkmanrc
node .nvmrc, .node-version
python .python-version
ruby .ruby-version, Gemfile
terraform .terraform-version, .packer-version, main.tf
yarn .yarnrc

RTX_ENV

環境変数RTX_ENVを設定することで.rtx.{RTX_ENV}.tomlも読み込んでくれます。
読み込みの優先順位は以下のようになっています。

  • .rtx.toml
  • .rtx.local.toml
  • .rtx.{RTX_ENV}.toml
  • .rtx.{RTX_ENV}.local.toml

他のツールとの使い分け方

asdfとの比較

rtxのほうが圧倒的に速いのでrtxを使ったほうがいいです。
さらに最初からaliasの機能がついています。
あと、便利かどうかは置いておいて環境変数の設定ができます。

nvmやpyenvなどとの比較

こちらはWSL2を使わないWindows環境ではrtxもadsfも利用できないので、その場合はnvmやpyenvなどを利用することになると思います。

それ以外の場合は、ツールごとにインストールしたり、CLIコマンドを覚えたり、設定したりするのは面倒ですし、基本はrtxを使っても良いと思います。
pyenvはvirtualenvと組み合わせて使うことが多いですが、rtxはvirtualenvにも対応しています。

homebrewやaptなどのパッケージマネージャとの比較

プログラミング言語のようにプロジェクトやディレクトリごとに言語のバージョンを使い分けたい場合はrtxを使って、gitやrtx、nvmのように基本的にツールの最新バージョンを使えば問題ないものはhomebrewなどからインストールするのが良いと思います。

まとめ

私もこのツールを使い始めてからまだ日が浅いのですが、便利すぎてドキュメントを読み込んでしまったので、せっかくなので記事を書きました。

開発環境の構築は毎度毎度そこそこ億劫な作業なので、rtxがもっと流行ってほしいです。
日本の開発現場ではWindowsが多くあるし、WSL2がさくさく動くマシンじゃないことも多いので難しいかもしれないので早くWindowsにも対応してもらえるとめっちゃ嬉しいですね。

あと、繰り返しになりますが、プロジェクトのメンバー全員が同じツールを使っているとは限らないので、環境変数を設定する機能はちょっと導入が難しいかもなーと思います。

他には利用可能なファイル名で触れてますが、他のツールのファイルも使用可能なので、全員が一斉に移行せずともゆっくり移行していけるのも便利ですね。

参考資料

Discussion