初心者の初心者による初心者のためのバージョン管理ツール rtx 入門


:::note warn
2024/9/10

本記事の内容は古くなっています。最新版の記事を作成しましたのでそちらをご確認ください。
[初心者の初心者による初心者のための開発環境セットアップツール mise 入門（updated from rtx）](https://qiita.com/skyblue-jpn/items/58ad650f5a721f2ce890)
:::

# はじめに

バージョン管理ツールといえば anyenv や asdf が有名ですが、最近になって asdf の Rust クローンである rtx というものが登場しました。私も[こちらの記事](https://qiita.com/skyblue-jpn/items/cde18e0f295b4cd41895)で書いたように rtx を導入してみたので、いろいろいじりながらその使い方をまとめてみようと思います。

# 実行環境

-   WSL2 (Ubuntu)
-   fish shell
-   Homebrew 導入済み

ほかの環境での使い方もまとめるつもりですが一応。

# rtx とは

以降[公式ドキュメント](https://github.com/jdxcode/rtx)および `--help` を参考にしていきます。

## 概要

rtx のことを公式では "_Polyglot runtime manager (asdf rust clone)_" すなわち「_多言語対応ランタイムマネージャ（asdf rust クローン）_」と説明しています。詳しくは後述しますが、asdf と互換性がありつつもより高速に動作するようなバージョン管理ツールを目指しているようです。

## 特徴

公式ドキュメントによると rtx には以下のような特徴があるとのことです。

-   asdf 互換：rtx は asdf プラグインと `.tool-versions` ファイルに互換性があり、そのまま使うことができます。
-   多言語対応：あらゆる言語と互換性があるため、 nvm, nodenv, pyenv などがそれぞれどう動作するのか考える必要はありません。ただこれ一つを使えばいいのです。
-   高速：rtx は Rust で書かれており、非常に高速です。asdf より 20 倍から 200 倍は速いです。
-   shim 無し：（asdf で用いられる）shim は問題を引き起こし、ノードを破壊し、オーバーヘッドを増やします。我々は shim を使用しません。
-   より良い UX：asdf は asdf plugin add や asdf install のように多数のおかしな UX における意思決定がなされています。我々は rtx を使いやすくするために配慮しています。
-   ファジーマッチングとエイリアス：asdf のように正確なバージョン番号を指定する必要はありません。
-   ワンコマンドインストール：各プラグインを手動でインストールする必要がなく、`rtx install --all` を実行するだけで、必要なプラグインを全てインストールしてくれます。

このように rtx は asdf よりも使いやすいツールであるということを標榜しています。

# 導入方法

ここでは公式ドキュメントにある導入方法をまとめていきたいと思います。

まず、前提として rtx が対応しているのは macOS および linux のみです。今のところ Windows には対応する予定はないようですので、Windows ユーザーは WSL を用いるべきでしょう。

## インストール

### スタンドアローン

パッケージマネージャを使わない場合はこちらの方法を用います。

```sh:sh
$ curl https://rtx.pub/install.sh | sh
```

シェルスクリプトを使いたくない場合は以下のコマンドを実行します。

```sh:sh
$ curl https://rtx.pub/rtx-latest-macos-arm64 > /usr/local/bin/rtx
```

rtx の置き場所はどこでもいいそうなので、適宜 `~/bin`, `/usr/local/bin`, `~/.local/share/rtx/bin/rtx` などと読み替えてください。また、ダウンロード先の URL もアーキテクチャ (`x64`, `arm64`) やプラットフォーム (`macos`, `linux`) に応じて適宜読み替えてください。

### Homebrew

```sh:sh
$ brew install jdxcode/tap/rtx
```

### Cargo

Cargo でソースからビルドする場合、こちらを使います。

```sh:sh
$ cargo install rtx-cli
```

cargo-binstall を用いるとより高速になります。

```sh:sh
$ cargo install cargo-binstall
$ cargo binstall rtx-cli
```

### npm

```sh:sh
$ npm install -g @jdxcode/rtx
```

フルインストールせずに試したい場合は npx を使います。

```sh:sh
$ npx @jdxcode/rtx exec python@3.11 -- python some_script.py
```

### Github Releases

[Github](https://github.com/jdxcode/rtx/releases) から最新版を入手したい場合はこちらを使います。

```sh:sh
$ curl https://github.com/jdxcode/rtx/releases/download/v1.9.0/rtx-v1.9.0-linux-x64 | tar -xJv
$ mv rtx/bin/rtx /usr/local/bin
```

### apt

Ubuntu/Debian でインストールする場合はこちらを使います。

```sh:sh
$ wget -qO - https://rtx.pub/gpg-key.pub | gpg --dearmor | sudo tee /usr/share/keyrings/rtx-archive-keyring.gpg 1> /dev/null
$ echo "deb [signed-by=/usr/share/keyrings/rtx-archive-keyring.gpg arch=amd64] https://rtx.pub/deb stable main" | sudo tee /etc/apt/sources.list.d/rtx.list # arm64 の場合
$ sudo apt update
$ sudo apt install -y rtx
```

### dnf

Fedora, CentOS, Amazon Linux, RHEL やその他の dnf-based distributions でインストールする場合はこちらを使います。

```sh:sh
$ dnf install -y dnf-plugins-core
$ dnf config-manager --add-repo https://rtx.pub/rpm/rtx.repo
$ dnf install -y rtx
```

### yum

```sh:sh
$ yum install -y yum-utils
$ yum-config-manager --add-repo https://rtx.pub/rpm/rtx.repo
$ yum install -y rtx
```

### aur

Arch Linux でインストールする場合はこちらを使います。

```sh:sh
$ git clone https://aur.archlinux.org/rtx.git
$ cd rtx
$ makepkg -si
```

## 初期化スクリプトへの記入

各シェルに合わせて以下のコマンドを実行します。

```sh:bash
$ echo 'eval "$(rtx activate bash)"' >> ~/.bashrc
```

```sh:zsh
$ echo 'eval "$(rtx activate zsh)"' >> ~/.zshrc
```

```sh:fish
$ echo 'rtx activate fish | source' >> ~/.config/fish/config.fish
```

[こちらのページ](https://tech.buty4649.net/entry/2023/02/05/231401)によると、fish の場合 `config.fish` に以下の記述が必要とのことです。

```config:config.fish
rtx activate fish | source
rtx hook-env -s fish | source  # プラグインのパスを追加する
rtx complete -s fish | source  # rtxの補完を追加
```

ほかのシェルでも同様の記述が必要なのか、検証でき次第追記したいと思います。

# 基本的な使い方

以下、断りのない限り私の環境での話となります。ほかの環境でも大きな違いはないと思いますが念のため。

## バージョンの確認

まず、無事にインストールできたかの検証もかねて試しにバージョンを確認してみます。

```shell-session:sh
$ rtx --version
1.9.0 linux-x64 (built 2023-02-13)
```

このような表示が出れば成功です。

## Python のインストール

ここでは Python をインストールしながら実際の使い方を見ていきます。rtx の使い方とはずれますが、[こちら](https://github.com/pyenv/pyenv/wiki)を参考にして事前に依存関係をインストールしておいてください。

### プラグイン一覧の表示

インストール可能なプラグインを確認します。

```shell-session:sh
$ rtx plugins ls -a
1password-cli
R
act

...

zola
zoxide
zprint
```

ちなみに、rtx は asdf のプラグインを使用しているため、[こちら](https://github.com/asdf-vm/asdf-plugins)からも一覧を確認できます。

### Python プラグインのインストール（省略可）

Python プラグインをインストールします。

```sh:sh
$ rtx install -p python
```

インストール出来たらインストール可能な Python ランタイム（バージョン）を確認します。

```shell-session:sh
$ rtx ls-remote python
2.1.3
2.2.3
2.3.7
2.4.0
2.4.1

...
```

### Python ランタイムのインストール

特定の Python ランタイム（バージョン）をインストールします。

```shell-session:sh
$ rtx install python@3.12-dev
⢁ Installing runtime: python@3.12-dev...

✓ Runtime python@3.12-dev installed
rtx: python@anaconda3-2022.05
```

なお、インストール可能な最新バージョン（執筆時点では Python 3.11.2）をインストールしたい場合は以下のコマンドを実行します。

```sh:sh
$ rtx install python@latest
```

また、事前に Python プラグインをインストールしていなかった場合、この時点で一緒にインストールされるので、Python プラグインを先にインストールしておかなくても大丈夫です。

インストールしたランタイムを確認してみます。

```shell-session:sh
$ rtx ls
   python 3.11.2
   python 3.12-dev
```

### デフォルトランタイムの設定

特定のランタイムをグローバルに適用する場合、以下のコマンドを実行します。

```sh:sh
$ rtx global python@3.11.2
```

設定できたことを確認します。

```shell-session:sh
$ rtx ls
-> python 3.11.2             (set by ~/.tool-versions)
   python 3.12-dev
```

特定のランタイムを現在のディレクトリに適用する場合、以下のコマンドを実行します。

```sh:sh
$ rtx local python@3.11.2
```

```shell-session:sh
$ rtx ls
-> python 3.11.2             (set by <current_directory>/.tool-versions)
   python 3.12-dev
```

この際、現在のディレクトリに `.tool-versions` というファイルが生成されます。

```tool-versions:.tool-versions
python 3.11.2
```

ランタイムをグローバルと同じにしたいときは `.tool-versions` を削除すれば良いです。

```sh:sh
$ rm .tool-versions
```

### ランタイム・プラグインの削除

ランタイムの削除をしたい場合、以下のコマンドを実行します。

```shell-session:sh
$ rtx uninstall python@3.11.2
uninstalling python@3.11.2
```

プラグインの削除をしたい場合、以下のコマンドを実行します。

```shell-session:sh
$ rtx plugins uninstall python
uninstalling plugin: python
```

プラグインを削除するとランタイムも同時に削除されます。

# コマンド一覧

最後に `rtx -h` と入力して rtx のコマンドを概観してみようと思います（`rtx --help` も同様）。

```shell-session:sh
$ rtx -h
Polyglot runtime manager (asdf rust clone)

Usage: rtx [OPTIONS] <COMMAND>

Commands:
  activate    Enables rtx to automatically modify runtimes when changing directory
  alias       Manage aliases [aliases: a]
  complete    generate shell completions
  current     Shows currently active, and installed runtime versions
  deactivate  disable rtx for current shell session
  direnv      Output direnv function to use rtx inside direnv
  doctor      Check rtx installation for possible problems.
  env         exports env vars to activate rtx in a single shell session [aliases: e]
  exec        execute a command with runtime(s) set [aliases: x]
  global      sets global .tool-versions to include a specified runtime [aliases: g]
  install     install a runtime [aliases: i]
  latest      get the latest runtime version of a plugin's runtimes
  local       Sets .tool-versions to include a specific runtime [aliases: l]
  ls          list installed runtime versions [aliases: list]
  ls-remote   list runtime versions available for install [aliases: list-remote]
  plugins     Manage plugins [aliases: p]
  settings    Manage settings
  uninstall   removes runtime versions
  version     Show rtx version
  help        Print this message or the help of the given subcommand(s)

Options:
  -v, --verbose...  Show installation output
  -h, --help        Print help (see more with '--help')
  -V, --version     Print version

Examples:
  rtx install nodejs@20.0.0       Install a specific node version
  rtx install nodejs@20.0         Install a version matching a prefix
  rtx local nodejs@20             Use node-20.x in current project
  rtx global nodejs@20            Use node-20.x as default

  rtx install nodejs              Install the version specified in .tool-versions
  rtx local nodejs                Use latest node in current directory
  rtx global system               Use system node everywhere unless overridden

  rtx x nodejs@20 -- node app.js  Run `node app.js` with PATH pointing to node-20.x
```

# おわりに

ここまで rtx の使い方についてまとめてきましたが、ここで挙げた内容は基本的な部分のみなので、いずれより詳細なコマンドの内容や、`config` ファイルの書き方などについてもまとめられればと思います。rtx は公開されたばかりでまだほとんど情報が出回っていないので、今後ユーザーが増えることを期待します。

# 参考文献

-   jdxcode. 2023. “Jdxcode/Rtx: Runtime Executor (Asdf Rust Clone).” GitHub. February 15, 2023. <https://github.com/jdxcode/rtx>.
-   ぶてい. 2023. “Rtx を使って Starship+Asdf のプロンプトの表示が遅くなる問題を解決する.” ぶていのログでぶログ. February 5, 2023. <https://tech.buty4649.net/entry/2023/02/05/231401>.
-   asdf-vm. 2023. “Asdf-Vm/Asdf-Plugins: Convenience Shortname Repository for Asdf Community Plugins.” GitHub. February 15, 2023. <https://github.com/asdf-vm/asdf-plugins>.