複数のランタイムバージョンをプロジェクト単位で管理できる rtx-cli の紹介 

# はじめに
この資料は Rust 製のコマンドラインツール rtx-cli について紹介するものです。
ヘルプメッセージやREADMEを抄訳して再編集したものですが、誤訳や解釈の間違いが含まれている可能性があることに注意してください。
これから使用する方々の助けになれば幸いです。

Rustの環境構築やツールのインストール方法は[こちら](https://pythonosaka.notion.site/Rust-5cae1c2f7c7f454d9636e047692652af) を参照してください。

## rtx-cli について

[rtx-cli](https://github.com/jdxcode/rtx)  は、Python や Go などのプログラミング言語に加え、awscli や terraform などの様々なツールのランタイムバージョンをプロジェクト単位で管理できる [asdf](https://github.com/asdf-vm/asdf) の代替CLIツールです。asdsf のプラグインをそのまま利用できるため、使用する言語のプラグインをインストールするだけで、複数のランタイムバージョンを単一のCLIツールで管理できるようになります。

コマンド名は `rtx` です。

## デモ
次のデモは、rtxを使用して異なるバージョンのnodeをインストールする例です。which node を呼び出すと、shim ではなく、nodeへの実際のパスが得られることに注目してください。
![rtx_demo.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/182364/daccbb5b-269b-2543-ae74-daf538e4c29d.gif)

# 特徴

- **asdf互換**
    - rtx は asdfプラグインや `.tool-versions` ファイルと互換性があります。
    - ドロップインの代替品として使用することができます。
- **多言語対応**
あらゆる言語と互換性があり、nvm, nodenv, pyenvなどの動作を個別に把握する必要がなく、1つのツールを使うだけです。
- **高速**
rtxはRustで実装されているため、非常に高速です。asdfの20倍から200倍の速さです。
- **shim を使用しない**
shim はたびたび問題を引き起こし、その問題解決の時間と、オーバーヘッドを増加させます。
rtxはデフォルトでshimを使用しませんが、使用したい場合は使用することもできます。
- **ファジーマッチとエイリアス**
nodeの "v20"が欲しい、"lts" のバージョンが欲しい、と指示するだけで十分です。rtxは、正確なバージョンを指定しなくても、正しいバージョンを割り出してくれます。
- **任意の環境変数**
`NODE_ENV=production` や `AWS_PROFILE=staging` のように、プロジェクトディレクトリにいるときにカスタム環境変数を設定することができます。

# asdfとの比較

rtxはほとんどasdfのクローンですが、改善されている部分が目立ちます。

## パフォーマンス

asdfは、ランタイムの呼び出しとランタイム自体の間に入るshimを使う設計になっています。例えば、nodeを呼び出すと、asdfの shimファイル `~/.asdf/shims/node` を呼び出し、`asdf exec` を呼び出し、それから適切なバージョンのnodeを呼び出します。

この shim のパフォーマンスは劣悪です。（訳注：それでも　asdf は anyenv よりは速くマシです）

rtxは shim を使わず、代わりにPATHを更新して、単にバイナリを呼び出すときのオーバーヘッドがないようにします。この shim の遅さが、私が rtx を書いた主な理由です。この記事のデモのgifでは、node -vを呼び出すときにrtxは実際には使われていないことに注目してください。rtxを使わないでnodeを実行するのと同じパフォーマンスです。

asdfがこれらの問題を修正することは不可能だと思います。asdfの作者はパフォーマンスの問題について素晴らしい[記事](https://stratus3d.com/blog/2022/08/11/asdf-performance/)を書いています。asdfはbashで書かれているので、確かにパフォーマンスを上げるのは難しいのですが、しかし、本当の問題はシムの設計にあると思います。

rtxはディレクトリが変わるたびにrtx hook-envという内部コマンドを呼び出しますが、Rustで書かれているので、私のマシンでは10msほどで終わります。変更がなければ4ms、フルリロードであれば14msです。

要約すると、asdfはランタイムを呼び出すときにオーバーヘッド（~120ms）を追加し、rtxはプロンプトをロードするときにわずかなオーバーヘッド（~10ms）を追加します。

## 環境変数

asdfはランタイム実行ファイルの管理に役立つだけです。しかし、いくつかのツールは環境変数で管理されます。特にJavaは環境変数 `JAVA_HOME` で切り替わります。これはasdfではうまくサポートされていないため、管理するためだけに別のシェル拡張が必要です。

しかし、asdfプラグインには`JAVA_HOME`のような環境変数をエクスポートするための`bin/exec-env`スクリプトがあり、shim が呼び出されたときにのみコマンドへエクスポートすることができます。rtxはプラグイン内の`bin/exec-env`スクリプトから環境変数をエクスポートするだけで、すべてのコマンドでシェルに配置されます。このためasdf では　javaを呼び出すと`JAVA_HOME`が設定されますが、mvn のようなJavaツールを呼び出すと設定されません。

つまり、既存のプラグインスクリプトを使うだけなのですが、rtxは shim を使わないので、もっといろいろなことに使えるのです。dotenvやdirenvのような任意の環境変数をエクスポートするプラグインを作ることも簡単なことです。

## ユーザビリティ

いくつかのコマンドはasdfと同じですが、他のコマンドは変更されています。asdfで可能なことはすべてrtxでも可能なはずですが、若干異なるシンタックスを使用することがあります。rtxでは、ファジーマッチングを使用するなど、より寛容なコマンドがあります（例：`rtx install node@20` など）。asdfでは`asdf install node latest:20` を実行できますが、`.tool-versions` ファイルや他の多くの場所で`latest:20` を使用することはできません。rtxでは、どこでもファジーマッチングを使用することができます。

asdfでは、プラグインがインストールされていない場合、新しいランタイムをインストールするためにいくつかのステップが必要になりす。

```bash
asdf plugin add node
asdf install node latest:20
asdf local node latest:20
```

rtxでは、ローカルランタイムのバージョンを設定するための1つのステップだけで、このすべてを実行することができます。プラグインやランタイムをインストールする必要がある場合は、プロンプトが表示されます：

```bash
rtx local node latest:20
```
また、複数バージョンのランタイムをインストールしたいときは、asdf では複数回 `asdf install`  を実行する必要がありますが、rtx では一度の `rt install` ですみます。

```bash
rtx install python@3.9 python@3.10 python@3.11
```

asdfは特に堅苦しく、学ぶのが難しいと感じています。また、`asdf list all` と `asdf latest --all` のように奇妙なインターフェース設計があります。（なぜlatestはフラグで、list では位置引数なのか？）

rtxはエイリアスを多用しているので、`rtx plugin add node` なのか `rtx plugin install node` なのかを覚えておく必要はありません。あなたの意図を汲み取って、rtxが正しい方法で反応するようにします。

とはいえ、asdfには素晴らしいところがたくさんあります。asdfは最高のマルチランタイムマネージャであり、プラグインシステムには本当に感心しました。作者が下した設計上の決断のほとんどは、とても良いものでした。shim とそれがBashで書かれているということだけが不満です。

# 制限

activate コマンドは、WindowsのPowerShell には対応していません。

サポートしているシェルタイプ： `bash` , `fish` , `nu` , `xonsh` , `zsh`

Windows のサポートは [Issue#66](https://github.com/jdxcode/rtx/discussions/66) になっていて、現在作業中です。

# インストール

rtx 本体のインストールは次のように行います。

```bash
$ cargo install rtx-cli
```

cargo-bininstall がインストールされているのであれば、次のようにすることもできます。

```bash
$ cargo binstall rtx-cli
```

これは、rtx のレポジトリのリリースページからプラットフォームに応じたバイナリーをダウンロードして `$CARGO_HOME/bin` に配置します。バイナリが見つからなかった場合は、通常の cargo install の処理にフォールバックして処理してくれます。

## シェルの設定ファイル

シェルの設定ファイルに以下を追加します。

```bash
eval "$($CARGO_HOME/bin/rtx activate bash)"
```

上記は、Bash の場合です。

指定可能なシェル： `bash` , `fish` , `nu` , `xonsh` , `zsh`

rtx では、キャッシュやプラグインなどでいくつかのディレクトリを使用しています。次の設定をしておくと、すべてのディレクトリが `~/.rtx` に以下に配置されるようになるのでお勧めです。

```bash
export RTX_DATA_DIR=$HOME/.rtx
export RTX_CACHE_DIR=$RTX_DATA_DIR/cache
```

## 依存パッケージをシステムに追加

プラグインを利用するために依存するパッケージをインストールする必要があります。

- Ubuntu / Debian
    
    ```bash
    apt install dirmngr gpg curl gawk
    ```
    
- CentOS / Rocky Linux / AlmaLinux
    
    ```bash
    yum install gnupg2 curl gawk
    # あるいは
    dnf install gnupg2 curl gawk
    ```
    
- macOS
    
    ```bash
    brew install gpg gawk
    ```
    

# 使用方法

```bash
rtx [OPTIONS] <COMMAND>
```

**オプション**

- `-h` , `—-help` 
ヘルプ情報を表示する
- `-V` , `—-version` 
バージョン情報を表示する
- `--install-missing` 
足りないツールを自動でインストールする
- `-j` , `--jobs`  `<JOBS>`
並行してインストールするプラグインとランタイムの数
デフォルト：利用可能なコア数
- `--log-level <LEVEL>`
ログ出力の冗長性を設定する
指定可能な値：`error`, `warn`, `info`, `trace`, `debug`
デフォルト：`info`
- `-r` , `--raw`
stdin/stdout/stderr を直接ユーザーへパイプする．
`—jobs=1` として実行される
- `-v` , `--verbose...`
冗長な出力を表示する

**コマンド**

- `activate` 現在のシェルでrtxを初期化する
- `alias` エイリアスを管理する [aliases: a] 。
- `bin-paths` アクティブなランタイムビンパスをすべてリストアップする
- `cache` rtxのキャッシュを管理する
- `completion` シェルの補完を生成する
- `current` 現在アクティブなランタイムとインストールされたランタイムのバージョンを表示する。
- `deactivate` 現在のシェルセッションでrtxを無効にする
- `direnv` direnv内部でrtxを使用するためのdirenv関数を出力する
- `doctor` rtxのインストールに問題がないかをチェックする。
- `env` , `e`  一回だけrtxを有効にするためのenvバーをエクスポートする 。
- `exec` , `x` ツールセットでコマンドを実行する。
- `implode` rtxのCLIと関連するデータをすべて削除する。
- `install` , `i` ツールのバージョンをインストールする。
- `latest` プラグインの最新バージョンを取得します。
- `ls` , `list` インストールされた、あるいは現在選択されているツールのバージョンを一覧する。
- `ls-remote` インストール可能なランタイムバージョンをリストアップします。
- `outdated` （実験的）時代遅れのツールバージョンを表示します。
- `plugins` , `p` プラグインを管理する。
- `prune` ツールの未使用バージョンを削除する。
- `reshim` シムファームを再構築する。
- `selfupdate` rtx自体をアップデートする。
- `settings` 設定を管理する。
- `shell` , `global` , `local` ツールバージョンを設定する。
- `trust` 設定ファイルを信頼済みとしてマークする。
- `uninstall` ランタイムバージョンを削除する。
- `upgrade` （実験的）古くなったツールのバージョンをアップグレードする。
- `use` , `u`  ローカルまたはグローバルでツールの有効なバージョンを変更する。
- `version` rtxのバージョンを表示する。
- `where` ランタイムのインストールパスを表示する。
- `which` bin名が指すパスを表示する。
- `node` nodeプラグインのコマンド。
- `help` このメッセージまたは指定されたサブコマンドのヘルプを表示する。

## 環境変数

- `RTX_DATA_DIR` 
asdf のプラグインやパッケージ を保存するディレクトリのパスを指定
デフォルト： `$XDG_DATA_HOME/rtx` (通常は、`＄HOME/.local/share/rtx`）
- `RTX_CACHE_DIR` 
rtxが内部キャッシュを保存するディレクトリのパスを指定
デフォルト
    - Linux: `~/.cache/rtx`
    - macOS：`~/Library/Caches/rtx`
- `RTX_CONFIG_FILE` 
設定ファイルのパスを指定する
デフォルト： `$XDG_CONFIG_HOME/config.toml` （通常は、`~/.config/rtx/config.toml`）
- `RTX_DEFAULT_TOOL_VERSIONS_FILENAME` 
パッケージの情報の設定ファイルの名前を変更する
デフォルト： `.tool-versions`
- `RTX_DEFAULT_CONFIG_FILENAME`
    
    `.rtx.toml` 以外に設定すると、rtx がその名前の設定ファイルを探すようになる。
    現在、 `.rtx.toml` 以外に変更しても、無視される
    デフォルトの設定ファイル名を変更する機能は完全に無効化されていることに注意
    
- `RTX_${PLUGIN}_VERSION`
    
    ランタイムのバージョンを設定する
    例：`RTX_NODE_VERSION=20`とすると、`.tool-versions` や `.rtx.toml` の設定に関係なく、`node@20.x` が使用される
    
- `RTX_LEGACY_VERSION_FILE`
プラグインが有効な場合、プラグインが他のバージョンマネージャで使用されるバージョンファイルを読むことがでる。
例：node のプラグイン nvm の場合は `.nvmrc`
- `RTX_USE_TOML
1` を設定すると、rtx はローカルの設定に `.tool-versions` の代わりに `.rtx.toml` を使用するようにデフォルトで設定される。
今のところ `rtx use` では、`--path` オプションで指定された場合以外は `.rtx.toml` しか参照しないので、この環境変数は無視される。.
- `RTX_TRUSTED_CONFIG_PATHS`
    
    txが自動的に信頼できるものとしてマークする設定ファイルのパスのリストを指定する。
    これらはコロン（`:`）で区切ることができる。
    
- `RTX_LOG_LEVEL`
    
    rtx のログレベルを指定する
    
    指定可能な値：`error`, `warn`, `info`, `trace`, `debug`
    
     `RTX_DEBUG=1`, `RTX_TRACE=1`, `RTX_QUIET=1` 
     コマンドラインオプション `--log-level` でも設定できる
    
- `RTX_LOG_FILE`
    
     logファイルのパスを指定する
    絵dフォルト：`=~/rtx.log`
    
- `RTX_LOG_FILE_LEVEL`
    
    `RTX_LOG_LEVEL` と似ているが、ログファイルでの出力レベルを指定する
    これは、ログを保存したいが、ディスプレイには表示させない場合に有効
    指定可能な値：`error`, `warn`, `info`, `trace`, `debug`
    
- `RTX_ALWAYS_KEEP_DOWNLOAD`
    
    `1` を設定すると、ダウンロードしたアーカイブを常に保持する
    デフォルトでは、インストール後に削除される。
    
- `RTX_ALWAYS_KEEP_INSTALL`
    
    `1` を設定すると、インストールディレクトリを常に保持する
    デフォルトでは、失敗すると削除される。
    
- `RTX_VERBOSE`
    
    `1` を設定すると、`rtx install` と r`tx plugin install` 時にインストール出力を表示する
    これは、`RTX_DEBUG=1` と同じように動作するべきで、同じもののために2つの設定があるわけではないが、今のところ別になっている。
    
- `RTX_ASDF_COMPAT`
    
    `1` を設定すると、`rtx local` と `rtx global` の実行時に、asdf で使える `.tool-versions` ファイルのみを出力する。これは、これらのファイルがasdfと非互換なrtxの機能を無効にする。
    
- `RTX_JOBS`
    
    並行してインストールするプラグインやランタイムの数を設定する。
    デフォルト： 4 
    
- `RTX_RAW`
    
    `1` を設定すると、プラグインスクリプトをstdin/stdout/stderrに直接パイプする。
    デフォルトではstdinは無効になっている：多数のプラグインを並行してインストールする場合はプロンプトが表示されないため
    プラグインが入力を受け付ける必要があるとき、あるいは正しくインストールされていないような場合に使用する。
    一度に実行できるプラグインスクリプトが1つだけなので、`RTX_JOBS=1` に設定される。
    
- `RTX_SHORTHANDS_FILE` 
省略記法のエイリアスを設定したショートハンドファイルのパスを指定する
組織内でプラグインを共有したい場合に有益。
    
    デフォルト： `~/.config/rtx/shorthands.toml`
    次のようなTOMLファイルを与える：
    
    ```toml
    elixir = "https://github.com/my-org/rtx-elixir.git"
    node = "https://github.com/my-org/rtx-node.git"
    ```
    
- `RTX_DISABLE_DEFAULT_SHORTHANDS`
    
    `1` を設定すると、プラグインをインストールする際の省略記法によるエイリアスを無効にする・
    プラグインをインストールするときには、完全なURLを指定する必要があることに注意。
    例：`rtx plugin install node https://github.com/asdf-vm/asdf-node.git` 
    
- `RTX_HIDE_UPDATE_WARNING`
    
    `1` を設定すると、rtxの新しいバージョンが利用可能になったときに表示される警告を非表示する
    
- `RTX_CONFIRM`
    
    プロンプトに対して自動的に `yes` または `no` と答えるようになる。
    スクリプトを作成するときに有益。
    指定可能な値：　`yes` , `no` 
    
- `RTX_EXPERIMENTAL`
    
    `1` を設定すると、rtx の実験的な機能を有効にする
    
- `RTX_ENV`　（実験的）
`.rtx.development.toml` などの環境依存の設定ファイルを有効にする
開発/ステージング/本番環境において、異なる環境変数の設定や異なるツールバージョンで使用できる
- `RTX_PYTHON_DEFAULT_PACKAGES_FILE`
python プラグインが読み取る
デフォルトでインストールされるPythonパッケージを1行に1つづつリストしたファイルをセットする

# 設定ファイル

rtx の設定は `~/.rtxrc` や `.rtx.toml` ファイルを作成することで変更することができます。

## `~/.rtcrc`

anyenvのような別のバージョン管理ツールを使用していた場合には、`legacy_version_file` を `yes` で設定しておくことをおすすめします。

- `legacy_version_file`
`yes` に設定すると、この機能をサポートしているプラグインが、他のバージョン管理ツールで使用されているバージョンファイルを読み取るようになります。
.python-version など
デフォルト： `no`
- `always_keep_download`
`yes` に設定すると、`rtx install` がダウンロードしたソースコードやバイナリを常に保持するようになります。`no` に設定すると、`rtx install`がダウンロードしたソースコードやバイナリは、インストールが成功した後に削除されます。
デフォルト： `no`

## `.rtx.toml`

`.rtx.toml` は、asdf スタイルの `.tool-versions` ファイルを、より柔軟性の高いファイルに置き換えた新しい設定ファイルです。`.tool-versions` では不可能な、以下のような機能をサポートしています。

- ディレクトリ内で任意の環境変数を設定する。
- `rtx-python` の `virtualenv='.venv'` のように、プラグインに引数を渡す。
- カスタムプラグインのURを指定する。

`.rtx.toml` のサンプルを次に示します。

```toml
[env]
# direnv/dotenv のように任意の環境変数を設定できる
NODE_ENV = 'production'

[tools]
# 単一または複数のバージョンを指定する
terraform = '1.0.0'
erlang = ['23.3', '24.0']

# 現在 .tool-versions でできることをすべてサポートしています。
node = ['16', 'prefix:20', 'ref:master', 'path:~/.nodes/14']

# 任意のオプション/引数をプラグインに渡す
# RTX_TOOL_OPTS__VENV=.venv
python = {version='3.10', virtualenv='.venv'}

[plugins]
# カスタムリポジトリのURLを指定する
# プラグインがまだ存在しない場合にのみ使用される
python = 'https://github.com/jdxcode/rtx-python'

[settings] # プロジェクトのローカルな設定
verbose = true

[alias.node] # プロジェクトのローカルなエイリアス
my_custom_node = '20'
```

`.rtx.toml` ファイルは階層構造になっています。カレントディレクトリにあるファイルの設定は、親ディレクトリの .rtx.toml で設定された内容を上書きします。

例えば、`~/Projects/GitHub/work/myproj/.rtx.toml` で以下のように定義されているとします。

```toml
[tools]
python = '3.10'
```

そして、`~/Projects/GitHub/work/myproj/backend/.rtx.toml` は次のように定義しているとします。

```toml
[tools]
python = '3.11'
```

アクティブなバージョンは `rtx ls -current` で確認することができます。

```toml
~/Projects/GitHub/work/myproj via 🐍 v3.10.11
❯ rtx ls -c
pdm    2.7.0   ~/Projects/GitHub/work/.tool-versions 2.7.0
python 3.10.11 ~/Projects/GitHub/work/myproj/.rtx.toml 3.10

~/Projects/GitHub/work/myproj via 🐍 v3.10.11
❯ cd backend

~/Projects/GitHub/work/myproj/backend
❯ rtx ls -c
pdm    2.7.0  ~/Projects/GitHub/work/.tool-versions 2.7.0
python 3.11.3 ~/Projects/GitHub/work/myproj/backend/.rtx.toml 3.11
```

`.rtx.production.toml`のような環境固有の設定ファイルを用意することもできます。

### `[env]` - 任意の環境変数

`.rtx.toml` の `[env]` セクションは、任意の環境変数を設定することができます。環境変数には、次のような単純な KEY/VALUE のエントリーを設定します。

```toml
[env]
NODE_ENV = 'production'
```

`PATH` は特別扱いされ、`env_path` に配列として定義する必要があります。

```toml
env_path = [
    # 絶対パスを追加する
    "~/.local/share/bin",
    # 相対パスを追加する
　　# .rtx.toml があるディレクトリからの相対パスになることに注意
    "./node_modules/.bin",
]
```

> 注意：
`env_path` はトップレベルのキーで、`[env]` セクションの内部には入りません。
> 

環境変数の値はテンプレートにすることができます、詳しくはテンプレートをご覧ください。

```toml
[env]
LD_LIBRARY_PATH = "/some/path:{{env.LD_LIBRARY_PATH}}"
```

`env_file` は、ロードする dotenvファイルを指定するために使用できます。

```toml
env_file = '.env'
```

> 注意：
`env_file` は、ファイルの先頭、`[env]` セクションの上に記述します。
> 

```toml
[env]
NODE_ENV = false # 以前の NODE_ENV の内容を上書きする
```

## レガシーバージョンファイル

rtx は asdf と同様にレガシーバージョンファイルをサポートしています。これは、`.node-version` や `.python-version` のような言語固有のファイルです。これらは、他の開発者にrtx や asdf のような特定のツールを使うことを強制せずに、プロジェクトのランタイムバージョンを設定したい場合に適しています。

これらはエイリアスをサポートしていて、`lts/hydrogen`を含む `.nvmrc` ファイルがあれば、rtx とnvm で動作することを意味します。

以下は、サポートされているレガシーバージョンファイルの一部です。

| プラグイン | レガシーバージョンファイル/慣用的バージョンファイル |
| --- | --- |
| crystal | .crystal-version |
| elixir | .exenv-version |
| golang | .go-version, go.mod |
| java | .java-version |
| node | .nvmrc, .node-version |
| python | .python-version |
| ruby | .ruby-version, Gemfile |
| terraform | .terraform-version, .packer-version, main.tf |
| yarn | .yarnrc |

rtxでは、これらはデフォルトで有効になっています。

次のコマンドで無効にすることができます

```bash
$ rtx settings set legacy_version_file false
```

プラグイン `bin/parse-version-file` によって実行されるため、パースされる際にパフォーマンスコストが発生します。しかし、これらはキャッシュされるため、大きな問題ではありません。気づかないかもしれません。

> 備考：
asdfはこれらを「レガシーバージョンファイル」と呼んでいるので、私たちもそうしています。
この呼び方は、使ってはいけないという意味合いが強いので、良くない呼び方だと思います。asdf や rtxに特化したバージョンファイルではなく、他のツールでも使用できるバージョンファイルなので、私は「慣用的(idiomatic)バージョンファイル」という呼び方を好んでいます。
(.nvmrcは顕著な例外で、特定のツールに縛られています。)
> 

## `.tool-versions`

`.tool-versions`ファイルはasdfの設定ファイルですが、rtxでも`.rtx.toml` と同様に使用することができます。柔軟性に欠けるので、代わりに `.rtx.toml` を使うことが推奨されます。`.tool-versions` ファイルをたくさん持っていたり、asdfを使うチームで作業している場合に便利です。

以下は、サポートされているすべての構文を含む例です：

```
node        20.0.0       # コメント表記が可能です
ruby        3            # ファジーバージョンの指定
shellcheck  latest       # "latest" で最新バージョンを指定
jq          1.6
erlang      ref:master   # vcs refからコンパイルする
golang      prefix:1.19  # "1.19"が完全に一致する場合、最新の1.19.xを使用　
shfmt       path:./shfmt # カスタムランタイムを指定
node        lts          # lts バージョンの node を使用する (すべてのプラグインでサポートされているわけではない）

# 以下の構文は実験的なものであり、変更される可能性がある
node        lts!-2       # 最新のltsから2バージョン古いものをインストールする（例：ltsが20なら18）
python      latest!-0.1  # 最新が3.11の場合、python-3.10をインストールする
```

## `~/.config/rtx/config.toml`

rtxは、`~/.config/rtx/config.toml` で設定することができます。ローカルの `.rtx.toml` ファイルとよく似ていますが、すべてのディレクトリから参照されます。

```toml
[tools]
# グローバルツールのバージョンを指定
# `rtx use -g` で設定することができる
node = 'lts'
python = ['3.10', '3.11']

[settings]
# プラグインが有効な場合、他のバージョンマネージャが使用するバージョンファイルを読み込むことができる
# 例えば、node の nvm の場合は .nvmrc
legacy_version_file = true         # デフォルトで有効（asdfと異なる）

# `rtx install` を実行したときに、ダウンロードしたアーカイブを常に保持するように設定する。
always_keep_download = false        # デフォルトではインストール後に削除される
always_keep_install = false         # デフォルトでは失敗時に削除される

# プラグインリポジトリの更新を取得する頻度（分単位）を設定
# 新しいランタイムがインストールされるたびに更新される
# 注意：現在は未実装ですが、追加される予定があります:
#  (https://github.com/jdxcode/rtx/issues/128)
plugin_autoupdate_last_check_duration = '1 week' # 更新を無効にする場合は0に設定する

# これらの接頭辞を持つ設定ファイルは、デフォルトで信頼される
trusted_config_paths = [
    '~/work/my-trusted-projects',
]

verbose = false     # trueに設定すると、完全なインストール出力が表示される（環境変数：RTX_VERBOSE）
asdf_compat = false # trueに設定すると、.tool-versions が asdf と互換性があるようにする （環境変数：RTX_ASDF_COMPAT)
jobs = 4            # 並行してインストールするプラグインやランタイムの数. デフォルト：`4`
raw = false         # trueに設定すると、プラグインを直接 stdin/stdout/stderr にパイプする
shorthands_file = '~/.config/rtx/shorthands.toml' # ショートハンドファイルへのパスを指定環境変数：RTX_SHORTHANDS_FILE)
disable_default_shorthands = false # trueに設定すると、デフォルトの省略記法を無効にする（環境変数：RTX_DISABLE_DEFAULT_SHORTHANDS）

experimental = false # trueに設定すると、実験的な機能を有効にする
log_level = 'debug' # ログレベルを指定（環境変数：RTX_LOG_LEVEL）

[alias.node]
my_custom_node = '20'  # `rtx install node@my_custom_node` は node-20.x をインストールすることになる
                       # これはプラグインで指定することも可能です
```

## エイリアス

rtxは、ランタイムのバージョンのエイリアスをサポートしています。これは、ランタイムのLTSバージョンのエイリアスを定義するようなときなどに使用します。

例えば、`.tool-versions` や `.rtx.toml` で `node@20.x` を `node lts/hydrogen` と設定できるようにしたい場合です。

ユーザーエイリアスは、`~/.config/rtx/config.toml` に `[alias.<PLUGIN>]` セクションを追加することで作成することができます。

```toml
[alias.node]
my_custom_20 = '20'
```

プラグインは、`bin/list-aliases` スクリプトを使用してエイリアスを提供することもできます。

以下は、node.jsのバージョンを表示する例です、

```bash
#!/usr/bin/env bash

echo "lts/hydrogen 18"
echo "lts/gallium 16"
echo "lts/fermium 14"
```

# プラグイン

rtxは、asdfのプラグインエコシステムを利用しています。これらのプラグインには、`bin/install` (プラグインのインストール) や `bin/list-all` (利用可能なすべてのバージョンをリストアップ) といったシェルスクリプトが含まれています。

組み込みのプラグインの省略記法のリスト、プラグインを作成する方法、またはプラグインがどのように動作するかについての詳細は、[asdf を紹介した資料](https://qiita.com/iisaka51/items/eeb3a7fdc2b4f70b2b4f)も参考にしてください。

## プラグインオプション

rtxは「プラグインオプション」をサポートしています。プラグインの動作を変更するために `.rtx.toml` で指定する設定です。例えば、pythonランタイムのvirtualenvがその例です：

```toml
[tools]
python = {version='3.11', virtualenv='.venv'}
```

これは、すべてのプラグインスクリプトに `RTX_TOOL_OPTS__VIRTUALENV=.venv` として渡されます。ユーザーは任意のオプションを指定でき、そのフォーマットでプラグインに渡されます。

現在のところ、これは単純な文字列しかサポートしていませんが、必要性があれば、より複雑な型（配列、テーブル）にも対応できるようにすることはかなり簡単です。

# コアプラグイン

rtxには、Rustで書かれたCLIに組み込まれたプラグインがあります。これらは新しいもので、時間の経過とともに改良されていくでしょう。これらのプラグインは、同じ名前のプラグインをインストールすることで、簡単に上書きすることができます。

コアプラグインは、`rtx plugin ls --core` で見ることができます。

- Python - 実験的
- NodeJS
- Ruby - 近日公開予定
- Java - 近日公開予定
- Go - 近日公開予定

## Python コアプラグイン

ゴローバル設定ファイ（~/.config/rtx/config.toml）に以下を追加して、実験的機能を有効化します。

```toml
[settings]
experimental = true
```

これで、python コアプラグインが利用できるようになります。

```
$ rtx plugins -c
node
python
```

[asdf-python](https://github.com/asdf-community/asdf-python) や [rtx-python](https://github.com/rtx-plugins/rtx-python) を使用したいときは、明示的にURLを指定してプラグインを追加ます。

```
$ rtx plugins add python https://github.com/rtx-plugins/rtx-python
```

### 複数バージョンのPythonを使い分ける

python コアプラグインでは、複数バージョンを使い分けることが簡単になります。

```bash
$ rtx use -g python@3.11 python@3.10 python@3.9
```

最初に引数に与えたバージョンがデフォルトになります。

```bash
$ python -V
Python 3.11.3

$ python3.11 -V
Python 3.11.3

$ python3.10 -V
Python 3.10.11
```

### デフォルトのPythonパッケージ

Pythonをインストールした直後に、pipで自動的にPythonパッケージのデフォルトセットをインストールすることができます。この機能を有効にするには、環境変数 `RTX_PYTHON_DEFAULT_PACKAGES_FILE` に1行に1つのパッケージをリストアップしたファイルをセットします。

```bash
$ export RTX_PYTHON_DEFAULT_PACKAGES_FILE="~/config/rtx/default-python-packages"
```

あるいは、グローバル設定ファイルで定義することもできます。

```toml
[env]
RTX_PYTHON_DEFAULT_PACKAGES_FILE="~/config/rtx/default-python-packages"
```

このデフォルトのPythonパッケージを記述したファイルは次のようなものです。

```
numpy
scipy
```

### virtualenvの自動生成・有効化

Pythonコアプラグインはvirtualenvをサポートしていて、以下のような `.rtx.toml` の設定で使用します。

```toml
[tools]
python = {version="3.11", virtualenv=".venv"} # このファイルがあるディレクトリに対する相対パス
python = {version="3.11", virtualenv="/root/.venv"} # 絶対パス
python = {version="3.11", virtualenv="{{env.HOME}}/.cache/venv/myproj"} # テンプレートを使って、環境変数を参照できる
```

# ディレクトリ

以下は、rtxが使用するディレクトリです。これらはデフォルトのディレクトリです。

## `~/.config/rtx`

グローバル設定ファイル `~/.config/rtx/config.toml` を格納するディレクトリです。

グローバル設定ファイルは環境変数 `RTX_CONFIG_FILE` で設定することができます。

## `~/.cache/rtx`

macOSでは、`~/Library/Caches/rtx` になります。

プラグインの利用可能な全バージョンのリストなど、rtxが使用する内部キャッシュが格納されます。

環境変数 `RTX_CACHE_DIR` で設定することができます。

詳しくは、「キャッシュの動作」を参照してください。

## `~/.local/share/rtx`

rtxが使用するメインディレクトリで、プラグインやツールがインストールされる場所です。

asdfの`~/.asdf` とほぼ同じなので、これらをシンボリックリンクしてasdfとrtxを同時に使うことで何とかなるかもしれません。(ただし、これをサポートすることはプロジェクトの目標ではありません）

環境変数 `RTX_DATA_DIR` で設定することができます。

## `~/.local/share/rtx/downloads`

プラグインがオプションでtarballのようなダウンロードしたアセットをキャッシュする場所です。rtxがここからファイルを削除しないようにするためには、`always_keep_downloads` の設定を使用します。

## `~/.local/share/rtx/plugins`

`rtx plugins install` を実行すると、rtxはこのディレクトリにプラグインをインストールします。プラグインを作業している場合は、実行して手動でシンボリックリンクすることをお勧めします：

```bash
ln -s ~/src/rtx-my-tool ~/.local/share/rtx/plugins/my-tool
```

## `~/.local/share/rtx/installs`

`rtx install` を実行する際に、ツールがインストールされる場所です。

例えば、`rtx install node@20.0.0` は `~/.local/share/rtx/installs/node/20.0.0` にインストールされます。

また、バージョンプレフィックス（`20` , `20.15`）および一致するエイリアス（`lts` , `latest`）のために、このディレクトリへの他のシンボリックリンクが作成されます。たとえば、次のようになります：

```bash
20 -> ./20.15.0
20.15 -> ./20.15.0
latest -> ./20.15.0
lts -> ./20.15.0
```

## `~/.local/share/rtx/shims`

rtxがシムを配置する場所です。一般的には、IDEとの連携や、`rtx activate` が何らかの理由でうまくいかない場合に使用します。

# キャッシュの動作

rtxでは、効率的な処理を行うために、様々な場所でキャッシュを利用しています。キャッシュをどの程度の期間保持するかの詳細は、最終的にはすべて設定可能であるべきです。現在の動作では、ハードコードされている部分があるかもしれませんが、必要な設定を追加していくことは可能です。

以下、キャッシュにまつわる動作について説明します。更新されていないように見える動作がある場合は、ここから調べ始めるとよいでしょう。

## プラグイン/ランタイムキャッシュ

各プラグインにはキャッシュがあり、`~/$RTX_CACHE_DIR/<PLUGIN>` に格納されます。このキャッシュには、そのプラグインで利用可能なバージョンのリスト（`rtx ls-remote <PLUGIN>`）、レガシーバージョンファイル名（下記参照）、エイリアスのリスト、各ランタイムのインストール内のbinディレクトリ、ランタイムがインストールされた後のexec-envの実行結果などが格納されます。

リモートバージョンは、デフォルトで毎日更新されます。ファイルはzlib と messagepackで作成されていて、これを表示したい場合は以下を実行します。（[msgpack-cli](https://lib.rs/crates/msgpack-cli)  と [zclib](https://github.com/reu/zclib) が必要）

```bash
$ zclib -d $RTX_CACHE_DIR/node/remote_versions.msgpack.z | mpk -j --pretty
```

スクリプトが単に静的な値をエクスポートしていない場合、exec-envのキャッシュが問題になるかもしれないことに注意してください。しかし、もしあなたが動的なexec-envを持つプラグインで作業しているのであれば、チケットを送信してください。

exec-envのキャッシュは、rtxが初期化されるたびにbashを呼び出す必要があるので、rtxのパフォーマンスを大幅に改善しました。理想的には、この動作を維持することができます。

# テンプレート

> 注意：
この機能は実験的なものであり、将来的に変更される可能性があります。
> 

テンプレートは、以下の場所で使用されます：

- `.tool-versions` ファイル
- `.rtx.toml` ファイル（ほとんどの設定用）

テンプレート内では、以下のコンテキストオブジェクトが利用可能です：

- `env: HashMap<String, String>` 
現在の環境変数
- `config_root:PathBuf` 
`.rtx.toml`ファイルを含むディレクトリ。

また、以下のような関数もあります：

- `exec(command: &str) -> String`
 コマンドを実行し、その出力を返す。

テンプレートは[tera](https://tera.netlify.app/docs)クレートでパースされ、非常に強力です。例えば、以下のようにすると、プロジェクトのディレクトリ名を取得することができます：

```toml
[env]
PROJECT_NAME = "{{config_root | split(pat='/') | last}}"
```

`exec()` を使った別の例です。

```toml
[aliases]
current = "{{exec(command='node --version')}}"
```

# 環境設定（実験的）

同じディレクトリにある `.rtx.toml` を開発環境と本番環境のように分けて設定することが可能です。この機能を有効にするためには、`~/.config/rtx/config.toml` で `experimental = true` を設定し、環境変数 `RTX_ENV` に `development` や `production` などの環境名を設定します。

また、rtx はカレントディレクトリにある `.rtx.local.toml` や `.rtx.{RTX_ENV}.local.toml` などのローカルファイルを探します。これらはバージョンコントロールにコミットされないことを意図しています。`.gitignore`ファイルに `.rtx.*.local.toml` を追加してください。

これらのファイルの優先順位は次の通りです（番号が大きいほど優先されます）：

1. `.rtx.toml`
2. `.rtx.local.toml`
3. `.rtx.{RTX_ENV}.toml`
4. `.rtx.{RTX_ENV}.local.toml`

どのファイルが使用されているかは、`rtx doctor` で確認できます。

現在、環境変数 `RTX_DEFAULT_CONFIG_FILENAME` を `.rtx.toml` 以外に変更しても、無視されるのでので注意してください。今のところ、デフォルトの設定ファイル名を変更する機能は完全に無効化されてい

ます。将来的には変更される可能性があります。

# Shim

rtxのPATHデザインは、ほとんどの場合においてうまく機能しますが、shimの方が望ましい状況もあります。例えば、IDEからrtxのバイナリを呼び出す場合です。

これをサポートするために、rtxはshimディレクトリを用意しています。場所は`~/.local/share/rtx/shims`です。

```bash
$ rtx i node@20.0.0
$ rtx reshim          # 新しいシムを作成する必要があるときに、必要になることがある
$ ~/.local/share/rtx/shims/node -v
v20.0.0

```

shim の挙動については、[asdf を紹介した資料](https://qiita.com/iisaka51/items/eeb3a7fdc2b4f70b2b4f)を参考にしてください。

# direnv

[direnv](https://direnv.net/) と rtx は、どちらもディレクトリを基準にして環境変数を管理します。両方とも、それぞれの「フック」コマンドを実行する前後に現在の環境変数を分析するため、場合によっては衝突することがあります。もし問題が発生するのであれば、それはPATHの順序に関係している可能性が高いです。つまり、direnvとrtxで同じツールを管理しようとしている場合にのみ、問題となる可能性があります。例えば、`.envrc` で layout python を使いながら、pythonの入った `.tool-versions`ファイルも管理するような場合です。

もっと典型的なdirenvの使い方は、任意の環境変数を設定したり、関係ないバイナリをPATHに追加することです。このような場合、rtxはdirenvを邪魔することはありません。

## direnvの内部でrtxを使う（.envrcでrtxを使う）

rtxの起動に問題がある場合、あるいはdirenvを別の方法で使いたい場合、機能性を犠牲にしてでも、問題を起こしにくい、よりシンプルな設定は .envrc で rtx を使用することです。

direnvのlayout pythonをrtxで使いたい場合は、この方法が必要かもしれません。そうでなければ、rtxがdirenvのPATHを上書きしてしまう可能性があります。

これを行うには、まずrtxを使って、`.envrc`ファイルで使える`use_rtx`関数を構築します：

```bash
$ rtx direnv activate > ~/.config/direnv/lib/use_rtx.sh
```

次に、`.envrc` ファイルに以下を追加します：

```bash
use rtx
```

direnvは、環境変数をエクスポートするためにrtxを呼び出すようになります。rtxを使うすべてのプロジェクトにuse_rtxを追加する必要があります（またはdirenvのsource_upを使ってサブディレクトリからロードしてください）。また、`~/.config/direnv/direnvrc` に `use rtx` を追加することもできます。

この方法では、direnvは通常、`.envrc`ファイルと同じレベルにない限り、`.tool-versions`ファイルをリフレッシュしないことに注意してください。このため、`.tool-versions`ファイルの隣に`.envrc`ファイルを置いておきたい場合が多いでしょう。`.tool-versions` を使わず、`.envrc`で環境変数を設定することを推奨します。

```bash
export RTX_NODE_VERSION=20.0.0
export RTX_PYTHON_VERSION=3.11
```

もちろん、`rtx activate` を使用すれば、これらの手順は必要なく、direnvを使用していないかのようにrtxを使用することができます。

また、どうしてもうまくいかない場合は、shim を使用することも試してみてください。

## direnvは必要ですか？

rtxをdirenvと互換性を持たせることはこのプロジェクトの大きな目標ですが、必要であればrtxがdirenvを置き換えることができるようにしたいとも思っています。そのため、rtxでは`.rtx.toml`を使ったpythonの環境変数とvirtualenvの管理をサポートしています。

もし、direnvが必要な場合は、issueを発行して、その内容を私に知らせてください。

# CI/CD

CI/CDでrtxを使うと、dev/buildのツールバージョンを同期させることができます。

## GitHub アクション

[jdxcode/rtx-action](https://github.com/jdxcode/rtx-action)を使用する例：

```yaml
jobs:
  lint:
    runs-on: ubuntu-latest
    steps:
      - uses: jdxcode/rtx-action@v1
      - run: node -v # will be the node version from `.rtx.toml`/`.tool-versions`
```

# IDEとの統合

IDEは、環境変数の変更よりも shim との連携がうまくいきます。最も簡単な方法は、rtx の shims ディレクトリを PATH に追加することです。

IntelliJ と VSCode、そしておそらく他のIDEでは、`~/.zprofile` を以下のように変更することができます。

```bash
export PATH="$HOME/.local/share/rtx/shims:$PATH"
```

これは、rtxのすべての機能に対して機能するわけではありません。例えば、`[env]`セクションにある任意の環境変数は、shim が実行された場合にのみ設定されます。このためには、IDEとのより緊密な統合とカスタムプラグインが必要です。もしあなたが野心的であるのであれば、IDE用の既存のdirenv拡張を見て、それをrtxで動作するように修正できるかどうか検討してみてください。direnv と rtx は似たような動きをするので、出発点として使えるdirenv拡張があるはずです。

あるいは、direnv拡張と use_rtx direnv 関数を使うことで、より緊密な統合ができるかもしれません。

# neovim との統合

python を有効にしてビルドされた　neovim (おそらく大抵はそうなっている）で、`:checkhealth` を実行したとき、python をうまく見つけられるようにしておきましょう。

```
$ rtx use -g python@3.11
$ $RTX_DATA_DIR/installs/python/3/bin/python -m pip install npynvim
```

neovim の `init.lua` (通常は、`~/.config/nvim/init.lua`) に以下を記述します。

```

vim.g.loaded_python_provider = 0
vim.g.python3_host_prog = vim.env.RTX_DATA_DIR .. "/installs/python/3/bin/pytho
  n"
```


# 使用例

## ヘルプ表示

引数を与えずに実行するとヘルプメッセージが表示されます。

```bash
$ rtx
```

asdf では、言語やツールのバージョン管理を行うためには、まず始めに各言語やツールに対応したプラグインをインストールする必要がありますが、rtx では直接ランタイムをインストールすることができます。

```bash
$ rtx install python
```
これは、次のように処理されます。

```bash
$ rtx plugin install python  # install のエイリアスで、 i や a が使用できる
$ rtx install python   # バージョンを省略すると @latest が使用される
```

ランタイムと同じ名前のプラグインを探し、なければプラグインをインストールしてくれます。

ただし、プラグインが提供されている（rtx plugin ls-remote でみつかる）必要があります。

### プラグインの一覧

プラグインは次のコマンドで一覧できます。

```bash
$ rtx plugin list-remote
```

### プラグインを追加

例えば python プラグインを追加する場合は、次のようになります。

```bash
$ rtx plugin install python
```

### インストール済みのプラグインを参照

インストール済みのプラグインは次のコマンドで参照することができます。

```bash
$ rtx plugin list
python

```

## ランタイムをインストール

インストール可能なバージョンを一覧したいときは、次のようにコマンドを実行します。

```bash
$ rtx ls-remote python
```

最新バージョンの　python をインストールするためには、次のようにコマンドを実行します。

```bash
$ rtx install python@latest
```

インストール可能なバージョンの最新バージョンを確認するときは、次のように実行します。

出力はこの資料作成時でのバージョンです。

```bash
$ rtx latest python
3.11.3

$ rtx latest python@3.10
3.10.11

$ rtx latest python@miniforge3
miniforge3-22.11.1-4
```

 インストール可能なバージョンから特定のバージョンを指定してインストールすることができます。

```bash
$ rtx install python@3.10.11
```

 ファジーバージョンを指定した場合は、インストール可能なバージョンから合致するバージョンの最新のものがインストールされます。

```bash
$ rtx install python@miniforge3
```

> 注意：
Anaconda Python (miniconda, miniforge 含む）をインストールした場合は、conda のbase環境がデフォルトで有効にならないようにしてください。
`conda config --set auto_activate_base false`
> 
> 
> ```bash
> $ rtx shell python@miniforge3
> $ conda init ${SHELL##*/}
> $ conda config --set auto_activate_base false
> $ rtx shell -u python@miniforge3
> ```
> 

## ツールのインストール

プラグインがあれば言語に限らずツールのバージョンも管理させることもできます。

例えば、Python のパッケージマネージャー　pdm をインストールする場合は、次のように実行します。

```bash
$ rtx install pdm   # バージョンを省略すると @latest が使用される
```



## バージョンを参照する

`rtx list` を実行すると、インストールされている言語やツールを参照することができます。

list に替えて ls でも同じ結果になります。

```bash
$ rtx ls
node   18.16.0
pdm    2.7.0           ~/Projects/GitHub/work/.tool-versions 2.7.0
python miniforge3-22.11.1-4
python 3.10.11         ~/Projects/GitHub/work/.tool-versions 3.10.11
python 3.11.3
```

ここで`.tool-versions` ファイルがついているものが現在有効なバージョンです。

現在設定されてるバージョンだけを参照したい場合は `——current` （あるいは `-c`）オプションを与えて実行します。

```bash
$ rtx ls -c
pdm    2.7.0   ~/Projects/GitHub/work/.tool-versions 2.7.0
python 3.10.11 ~/Projects/GitHub/work/.tool-versions 3.10.11
```

これは、`rtx current` コマンドでも確認することができますl。

```bash
$ rtx current
python 3.10.11
pdm 2.7.0
```

バージョンの選択は、カレントディレクトリにある `.tool-versions` ファイルが参照されます。

pyenv などで使用していた `.python-version` ファイルもサポートしたい場合は、`~/.rtxrc` に以下を追加してください。

```bash
legacy_version_file = yes
```

## バージョンを選択する

使用するランタイムのバージョンを選択する場合は、`global` , `shell` , `local` , `use` の4種類の方法があります。

| コマンド | 設定ファイル/環境変数 | 説明 |
| --- | --- | --- |
| `global`| `~/.tool-versions` | 指定がない場合に使用するバージョンを設定 |
| `use ——global` | `~/.config/rtx/config.toml` | 指定がない場合に使用するバージョンを設定 |
| `local`| $PWD/.tool-versions | 特定のディレクトリ内でだけバージョンを変更したい場合 |
`use` | `$PWD/.rtx.toml` | 特定のディレクトリ内でだけバージョンを変更したい場合 |
| `shell` | `RTX_${TOOL}_VERION` | 使用している shell の時だけバージョンを変更したい場合 |

例えば、プロジェクトのディレクトリにいるときだけ指定したPythonが有効になるようにする例です。

```bash
$ rtx local python 3.11.3
```
これは asdf と同じく、カレントディレクトリの `.tool-versions` に書き込まれます。
他にも　`rtx use` を使用することもできます。
```bash
$ rtx use python 3.11.3
```
この場合は、カレントディレクトリの `.rtx.toml` に書き込まれます。

この他に、`system` という特別なバージョン指定ができます。このバージョンを指定した場合は、`$RTX_DATA_DIR/installs/<TOOL>/bin` を `$PATH` から削除して見つかるランタイムが実行されます。

# スクリプトからの利用

`.tool-versions` や `.rtx.toml` を設定をしなくても、[shebang](https://ja.wikipedia.org/wiki/%E3%82%B7%E3%83%90%E3%83%B3_(Unix))でツールやそのバージョンを指定することができます：

```bash
#!/usr/bin/env -S rtx x node@20 -- node
// "env -S" allows multiple arguments in a shebang
console.log(`Running node: ${process.version}`);
```
# よくある質問

### .tool-versionsファイルをプロジェクトに入れたくないのですが

そのままでは、.tool-versions はgitが未追跡ファイル（untracked file）として表示されます。
gitがこれらのファイルを無視するようにするには、3つの方法があります：

- プロジェクトの`.gitignore`ファイルに`.tool-versions`を追加する。
この方法には、`.gitignore`ファイルをコミットする必要があるという欠点があります。
- プロジェクトの `.git/info/exclude` に `.tool-versions` を追加する。
このファイルはプロジェクトにローカルなので、コミットする必要はありません。
- `.tool-versions` をグローバルな `gitignore` (`core.excludesFile`) に追加する。
これにより、gitはすべてのプロジェクトの`.tool-versions`ファイルを無視するようになります。
必要であれば、`git add --force .tool-versions` を使ってプロジェクトに明示的に追加することができます。

### rtx activateは何をするのでしょうか？

シェルプロンプトが表示されるたびに `rtx hook-env` を実行するようにシェルフックを登録します。しかし、`.rtx.toml` が変更された場合など、ディレクトリを変更せずに実行する必要がある場合も多くあります。つまり、bashスクリプトなどの非インタラクティブなセッションで `rtx activate` を使おうとしても、`rtx hook-env` を呼び出すことがないため、結果的にPATHは変更されません。こうした場合では、PATHを更新したいときに `rtx hook-env` を手動で呼び出すか、代わりにshimsを使用することができます。

また、特定のコマンドにのみrtxを使用する必要がある場合は、コマンドの前に `rtx x --` を付けてください。例えば、`rtx x -- npm test` や `rtx x -- ./my_script.sh` のような感じです。

`rtx hook-env` は、変更が加えられていない場合、どんあ状況下であれすぐに終了します。これにより、コマンドを実行するたびにシェルがブロックされるのを防ぐことができます。`rtx hook-env` を自分で実行して出力される内容を確認することもできますが、すでにアクティブ化されているシェルにいる場合は、何も出力されない可能性があります。

`rtx activate` は、（ほとんどのシェルで）`rtx`と呼ばれるシェル関数も作成します。これは、`rtx shell` と `rtx deactivate` を `eval "$(rtx shell)"` のようにしなても動作させるためのトリックです。

### `rtx activate` は `~/.profile`, `~/.bash_profile`, `~/.zprofile` では動作しません。

`rtx activate` は、rcファイルでのみ使用する必要があります。これらは、実際のユーザがターミナルを使用しているときに使用される対話型のものです。IDEなどから実行されるのとは違います。非対話型のセッションではプロンプトが表示されないので、PATHが変更されることはありません。

非対話型のセッションで利用する場合、代わりにshimを使うことを検討してください。これは、実行されるたびに環境変数 `PWD` を調べて、正しいディレクトリに呼び出すようにします。また、PATH上に直接あることを期待する代わりに、`rtx exec` を呼び出すこともできます。非対話型シェルで `rtx env` を実行することもできますが、その場合はグローバルツールのセットアップのみとなります。別のプロジェクトに入るときに環境変数を変更することはありません。

また、スクリプトがランタイムを取得するためにrtxを呼び出す方法については、「スクリプトからの利用」の例を参照してください。これは、activate せずに rtx を使用するもう一つの方法です。

### rtxが失敗している、または正しく動作していない

まず、`RTX_DEBUG=1` または `RTX_TRACE=1` と環境変数を設定してみて、より多くの情報が得られるかどうか確認してください。また、`RTX_LOG_FILE_LEVEL=debug` と `RTX_LOG_FILE=/path/to/logfile` 環境変数を設定して、ファイルにログを書き込むこともできます。

もし、`activate` フックで何か起こっているのであれば、それを無効にして、`eval "$(rtx hook-env)"` を手動で呼び出してみるとよいでしょう。また、設定されている環境変数を出力する `rtx env` を使うのも有効です。また、asdf とより互換性のある shim の使用も検討してみてください。

ランタイムインストールがうまくいかない場合は、`--raw` フラグを使うと、逐次処理としてインストールされ、stdin/stdout/stderrがターミナルに直接接続されます。プラグインが何らかの理由であなたと対話しようとしている場合に有効です。

もちろんrtxのバージョンは `rtx --version` で確認し、最新であることを確認してください。

`rtx cache clean` で内部キャッシュを消去し、`rtx implode`で設定ファイル以外を削除することができます。

チケットを提出する前に、asdfでやっていたことをテストするのは良いアイデアです。そうすれば、問題がrtxにあるのか、特定のプラグインにあるのか、除外することができます。

例えば、`rtx install python@latest` がうまくいかない場合、`asdf install python latest` を実行して、`asdf-python` の問題であるかどうかを確認することができます。

最後に、`rtx doctor` は、診断情報とセットアップで検出された問題についての警告を表示することができます。バグレポートを提出する場合は、`rtx doctor` の出力を含めるようにしてください。

### Windowsのサポートは？

Windows は私たちが追加したいものです！（`[Issue #66](https://github.com/jdxcode/rtx/discussions/66)`）

近い将来の目標ではありませんし、プラグインの修正も必要ですが、実現可能なはずです。

### httpプロキシでrtxを使うにはどうしたらいいですか？

簡単な答え：`http_proxy` と `https_proxy` の環境変数を設定するだけです。これらは小文字にする必要があります。

rtx は http 自体には何もしません。唯一の例外は、新しいバージョンのチェックとrtxの自己更新です。プラグインのクローンには git を使い、プラグイン自身は一般に curl や wget でファイルをダウンロードします。

しかし、これは本当にプラグイン次第です。もしプロキシ関連でインストールに問題がある場合は、プラグインのリポジトリにissueを提出してください。

### プラグイン名の短縮表記は、どのようにリポジトリに対応するのでしょうか？

例：rtx plugin install node はどうやって https://github.com/rtx-plugins/rtx-nodejs をフェッチすることを知るのでしょうか？

asdfは、rtxがベースとして使用する短縮表記の[インデックス](https://github.com/asdf-vm/asdf-plugins)を維持しています。これは、rtxがリリースされるたびに定期的に更新されます。このリポジトリは、[ここ](https://github.com/jdxcode/rtx/blob/main/src/default_shorthands.rs)のコードベースに直接保存されています。このファイルの下部には、rtxがasdfの上に作る修正が含まれています。

### asdfからの移行はどうすればいいのですか？

まず、スタートガイドのように`rtx activate` でrtxを有効にし、シェルのrcファイルからasdfを削除してください。

その後、asdf の `.tool-versions` ファイルがあるディレクトリで `rtx install`を実行すれば、ランタイムがインストールされます。`cp -r ~/.asdf ~/.local/share/rtx` でasdfの内部ディレクトリをrtxにコピーして、これを回避することもできます。これは、同じ構造を使用しているため、うまくいくはずですが、これは公式にサポートされておらず、定期的にテストされていません。また、`RTX_DATA_DIR=~/.asdf` と設定し、何が起こるかを確認することもできます。

### rtxとasdfの互換性は？

rtx は asdf で使用される `.tool-versions` ファイルを読み込んでインストールできるはずです。asdfのプラグインはすべてrtxで使用できるはずです。rtxのコマンドは、asdf とは若干異なります。

```bash
rtx install node@20.0.0 
```

```bash
asdf install node 20.0.0
```

これは、複数のツールを一度に指定できるようにするためです。しかし、asdfスタイルの構文もまだサポートされていて、rtx install node 20.0.0 も動作します。これはほとんどのコマンドの場合ですが、コマンドのヘルプにasdfスタイルの構文がサポートされていると書かれていることもあります。

疑問がある場合は、asdf構文を試してみて、それが機能するかどうかを確認してください。うまくいかない場合は、チケットを発行してください。すべてのコマンドを同じようにサポートすることは不可能かもしれませんが、可能な限り一貫性を持たせるように努力すべきです。

これはユーザビリティの観点からではなく、asdfコマンドを呼び出すプラグインが引き続き動作するようにするために重要です。

asdfとの切り替えが必要な場合や、asdfユーザーがいるプロジェクトで作業する場合は、`RTX_ASDF_COMPAT=1` と環境変数を設定することができます。これにより、rtxがasdfと互換性のない `.tool-versions` ファイルを出力することを防ぐことができます。また、asdfのセットアップと競合しない `.rtx.toml` を代わりに使用することも検討してください。

### tmuxや他のシェル初期化スクリプトから呼び出すと、rtxが動作しない。

`rtx activate` は、シェルプロンプトが表示されるまでPATHを更新しません。そのため、プロンプトが表示される前にrtxが提供するツールにアクセスする必要がある場合、手動で`hook-env`を呼び出す必要があります。

```bash
eval "$(rtx activate bash)"
eval "$(rtx hook-env)"
python --version     # hook-env を明示的に呼び出した後でないと動作しない
```

「rtx activateは何をするのでしょうか？」も参照してください。

### CLIのカラー出力を無効化/強制化する方法は？

rtxは [console.rs](https://docs.rs/console/latest/console/fn.colors_enabled.html) クレートを使用しており、[clicolors](https://bixense.com/clicolors/) の仕様に準拠していて、次の環境変数の設定に従いカラー出力を制御することができます。

- `CLICOLOR` != `0`
ANSIカラーがサポートされており、プログラムがパイプで接続されていない場合に有効
- `CLICOLOR` == `0`
ANSIカラーエスケープコードを出力しない。
- `CLICOLOR_FORCE` != `0`
ANSIカラーは何があっても有効にする必要があります。

### rtxは安全なのでしょうか？

現状ではasdfより少し安全ですが、必要以上に安全ではありません。安全なサプライチェーンは非常に重要であるため、この分野での作業が行われるでしょう。詳しくはSECURITY.mdを参照してください。

# ドキュメント

## rtx のヘルプメッセージ

```bash
% rtx --help
rtx is a tool for managing runtime versions. https://github.com/jdxcode/rtx

It's a replacement for tools like nvm, nodenv, rbenv, rvm, chruby, pyenv, etc.
that works for any language. It's also great for managing linters/tools like
jq and shellcheck.

It is inspired by asdf and uses asdf's plugin ecosystem under the hood:
https://asdf-vm.com/

Usage: rtx [OPTIONS] <COMMAND>

Commands:
  activate     Initializes rtx in the current shell
  alias        Manage aliases [aliases: a]
  bin-paths    List all the active runtime bin paths
  cache        Manage the rtx cache
  completion   Generate shell completions
  current      Shows current 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 a single time [aliases: e]
  exec         Execute a command with tool(s) set [aliases: x]
  implode      Removes rtx CLI and all related data
  install      Install a tool version [aliases: i]
  latest       Gets the latest available version for a plugin
  ls           List installed and/or currently selected tool versions [aliases: list]
  ls-remote    List runtime versions available for install
  outdated     [experimental] Shows outdated tool versions
  plugins      Manage plugins [aliases: p]
  prune        Delete unused versions of tools
  reshim       rebuilds the shim farm
  self-update  Updates rtx itself
  settings     Manage settings
  shell        Sets a tool version for the current shell session
  trust        Marks a config file as trusted
  uninstall    Removes runtime versions
  upgrade      [experimental] Upgrades outdated tool versions
  use          Change the active version of a tool locally or globally. [aliases: u]
  version      Show rtx version
  where        Display the installation path for a runtime
  which        Shows the path that a bin name points to
  node         Commands for the node plugin
  help         Print this message or the help of the given subcommand(s)

Options:
      --install-missing
          Automatically install missing tools

  -j, --jobs <jobs>
          Number of plugins and runtimes to install in parallel
          default: 4

      --log-level <LEVEL>
          Set the log output verbosity

          [default: info]

  -r, --raw
          Directly pipe stdin/stdout/stderr to user.
          Sets --jobs=1

  -v, --verbose...
          Show installation output

  -h, --help
          Print help (see a summary with '-h')

  -V, --version
          Print version

Examples:
  $ rtx install node@20.0.0       Install a specific node version
  $ rtx install node@20.0         Install a version matching a prefix
  $ rtx install node              Install the node version defined in
                                  .tool-versions or .rtx.toml
  $ rtx use node@20               Use node-20.x in current project
  $ rtx use -g node@20            Use node-20.x as default
  $ rtx use node@latest           Use latest node in current directory
  $ rtx use -g node@system        Use system node everywhere unless overridden
  $ rtx x node@20 -- node app.js  Run `node app.js` with PATH pointing to
                                  node-20.x
```

# rtx サブコマンド詳細

各サブコマンドに共通するグローバルオプションを次に示します。

**グローバルオプション**

- `-h` , `—-help` 
ヘルプ情報を表示する
- `-v` , `--verbose...` 
冗長な出力を表示する、複数回し亭することができる
- `--install-missing`  
不足しているツールを自動でインストールする。
- `-j` , `--jobs` `<jobs>` 
並行してインストールするプラグインとランタイムの数
デフォルト：利用可能なコア数
- `--log-level <LEVEL>`
ログ出力の冗長性を設定する
指定可能な値：`error`, `warn`, `info`, `trace`, `debug`
デフォルト：`info`
- `-r` , `--raw`
stdin/stdout/stderr を直接ユーザーへパイプする．
`—jobs=1` として実行される

## `activate`

現在のシェルでrtxを初期化する

```bash
rtx activate [GLOBAL_OPTIONS] [COMMAND_OPTIONS] [SHELL_TYPE]
```

**コマンドオプション**

- `--status` 
ディレクトリ変更時に “`rtx <PLUGIN>@<VERSION>`”のメッセージを表示する

**引数**

- `[SHELL_TYPE]` 
シェルのタイプを指定する
指定可能な値： `bash` , `fish` , `nu` , `xonsh` , `zsh`

## `alias` , `a`

エイリアスを管理する

```bash
rtx alias [GLOBAL_OPTIONS] [COMMAND]
```

**コマンド**

- `get` プラグインのエイリアスを表示する
- `ls` , `list` 指定可能なエイリアスを一覧表示する（デフォルト）
- `set` , `add` , `create` プラグインのエイリアスを追加/更新する 。
- `unset` , `rm` , `remove` , `delete` , `del` プラグインのエイリアスを消去する
- `help` このメッセージまたは指定されたサブコマンドのヘルプを表示する

### `alias get`

プラグインのエイリアスを表示する

```bash
rtx alias get [GLOBAL_OPTIONS] <PLUGIN> <ALIAS>
```

**引数**

- `<PLUGIN>` 
エイリアスを表示するプラグインを指定する
- `<ALIAS>` 
表示するエイリアスを指定する

### `alias ls` , `alias list`

指定可能なエイリアスを表示する
これらはユーザー設定、またはプラグイン `bin/list-aliases` から取得することができる

```bash
rtx alias ls [GLOBAL_OPTIONS]
rtx alias list [GLOBAL_OPTIONS] 
```

**コマンドオプション**

- `-p` , `--plugin`  `<PLUGIN>`
指定したプラグインでフィルターする

### `alias set` , `alias add` , `alias create`

プラグインのエイリアスを追加/更新する 。

```bash
rtx alias set [GLOBAL_OPTIONS] <PLUGIN> <ALIAS> <VALUE>
rtx alias add [GLOBAL_OPTIONS] <PLUGIN> <ALIAS> <VALUE>
rtx alias create [GLOBAL_OPTIONS] <PLUGIN> <ALIAS> <VALUE>
```

**引数**

- `<PLUGIN>` 
エイリアスを追加/更新するプラグインを指定する
- `<ALIAS>` 
追加/更新するエイリアスを指定する
- `<VALUE>`
エイリアスにセットする値を指定する

### `alias unset` , `alias rm` , `alias remove` , `alias delete` , `alias del`

プラグインのエイリアスを消去する

```bash
rtx alias unset [GLOBAL_OPTIONS] <PLUGIN> <ALIAS>
rtx alias rm [GLOBAL_OPTIONS] <PLUGIN> <ALIAS>
rtx alias remove [GLOBAL_OPTIONS] <PLUGIN> <ALIAS>
rtx alias delete [GLOBAL_OPTIONS] <PLUGIN> <ALIAS>
rtx alias del [GLOBAL_OPTIONS] <PLUGIN> <ALIAS>
```

**引数**

- `<PLUGIN>` 
エイリアスを消去するプラグインを指定する
- `<ALIAS>` 
消去るエイリアスを指定する

## `bin-paths`

アクティブなランタイムビンパスをすべてリストアップする

```bash
rtx bin-paths [GLOBAL_OPTIONS] 
```

## `cache`

rtxのキャッシュを管理する

```bash
rtx cache [GLOBAL_OPTIONS] [COMMAND]
```

**コマンド**

- `clear` , `c`  rtx の全てのキャッシュファイルを削除する
- `help` このメッセージまたは指定されたサブコマンドのヘルプを表示する

### `cache clear` , `cache c`

rtx の全てのキャッシュファイルを削除する

```bash
rtx cache clear [GLOBAL_OPTIONS]
rtx cache c [GLOBAL_OPTIONS]
```

## `completion`

シェルの補完を生成する

```bash
rtx completion [GLOBAL_OPTIONS] [SHELL_TYPE]
```

**引数**

- `[SHELL_TYPE]` 
シェルのタイプを指定する
指定可能な値： `bash` , `elvish` , `fish` , `powershell`  , `zsh`

## `current`

現在アクティブなランタイムとインストールされたランタイムのバージョンを表示する。

```bash
rtx current [GLOBAL_OPTIONS] [PLUGIN]
```

**引数**

- `[PLUGIN]` 
プラグインを指定してフィルターする

## `deactivate`

現在のシェルセッションでrtxを無効にする

```bash
rtx deactivate [GLOBAL_OPTIONS] 
```

## `direnv`

direnv内部でrtxを使用するためのdirenv関数を出力する

```bash
rtx direnv [GLOBAL_OPTIONS] [COMMAND]
```

**コマンド**

- `activate` direnv内部でrtxを使用するためのdirenv関数を出力する
- `help` このメッセージまたは指定されたサブコマンドのヘルプを表示する

### `direnv activate`

direnv内部でrtxを使用するためのdirenv関数を出力する

```bash
rtx direnv activate [GLOBAL_OPTIONS]
```

## `doctor`

rtxのインストールに問題がないかをチェックする。

```bash
rtx doctor [GLOBAL_OPTIONS]
```

## `env` , `e`

一回だけrtxを有効にするための環境変数をエクスポートする 。

```bash
rtx env [GLOBAL_OPTIONS] [COMMAND_OPTIONS] [TOOL@VERSION]...
rtx e [GLOBAL_OPTIONS] [COMMAND_OPTIONS] [TOOL@VERSION]...
```

**コマンドオプション**

- `-J` , `—json`
JSON形式で出力する
- `-s` , `—shell`  `<SHELL>`
シェルのタイプを指定する
指定可能な値： `bash` , `fish` , `nu` , `xonsh` , `zsh`

**引数**

- `[TOOL@VERSION]…`
使用するツールを指定する

## `exec` , `x`

ツールセットでコマンドを実行する。

```bash
rtx exec [GLOBAL_OPTIONS] [COMMAND_OPTIONS] [TOOL@VERSION]...[-- <COMMAND>...]
rtx x [GLOBAL_OPTIONS] [COMMAND_OPTIONS] [TOOL@VERSION]...[-- <COMMAND>...]
```

**コマンドオプション**

- `-c` , `——command` `<COMMAND>`
実行するコマンドライン
- `-C` , `—cd`  `<DIR_PATH>`
実行する前に移動するディレクトリパス

**引数**

- `[TOOL@VERSION]…`
使用するツールを指定する
- `[— <COMMAND>…]`
実行するコマンドライン
`——command` オプションと同じ
ただし、rtx のオプションと区別するためにダブル・ダッシュ（`——`）に続けて指定する

## `implode`

rtxのCLIと関連するデータをすべて削除する。

```bash
rtx implode [GLOBAL_OPTIONS] [COMMAND_OPTIONS]
```

**コマンドオプション**

- `--config` 
config ディレクトリも削除する。
- `--dry-run` 
実際に削除せずに、削除されるディレクトリをリストアップする。

## `install` , `i`

ツールのバージョンをインストールする。

```bash
rtx install [GLOBAL_OPTIONS] [COMMAND_OPTIONS] [TOOL@VERSION]...
rtx i [GLOBAL_OPTIONS] [COMMAND_OPTIONS] [TOOL@VERSION]...
```

**コマンドオプション**

- `-f` , `--force` 
既にインストールされていても、強制的に再インストールする。

**引数**

- `[TOOL@VERSION]…`
インストールするツールを指定する

## `latest`

プラグインの最新バージョンを取得します。

```bash
rtx latest [GLOBAL_OPTIONS] <TOOL@VERSION>...
```

**引数**

- `<TOOL@VERSION>…`
インストールするツールを指定する

## `ls` , `list`

インストールされた、あるいは現在選択されているツールのバージョンを一覧する。

```bash
rtx ls [GLOBAL_OPTIONS] [COMMAND_OPTIONS] 
rtx list [GLOBAL_OPTIONS] [COMMAND_OPTIONS] 
```

**コマンドオプション**

- `-J` , `—json`
JSON形式で出力する
- `-p` , `--plugin`  `<PLUGIN>` 
指定したプラグインのツールバージョンのみを表示する。
- `-c` , `--current`  
`.tool-versions` もしくは `.rtx.toml` に指定されているツールバージョンのみを表示する。
- `-i` , `--installed`  
`.tool-versions` もしくは `.rtx.toml` に指定されているが、まだインストールされていないものを非表示にする

## `ls-remote`

インストール可能なランタイムバージョンをリストアップします。

```bash
rtx ls-remote [GLOBAL_OPTIONS] <TOOL@VERSION> [PREFIX]
```

**引数**

- `<TOOL@VERSION>`
インストールするツールを指定する
- `[PREFIX]` 
最新のバージョンを問い合わせる際に使用するバージョンプレフィックスを指定する

## `outdated`

（実験的）時代遅れのツールバージョンを表示します。

```bash
rtx outdated [GLOBAL_OPTIONS] [TOOL@VERSION]...
```

**引数**

- `[TOOL@VERSION]…`
古いバージョンを表示するツールを指定する
例：`node@20`  `python@3.10`
指定しない場合、グローバルおよびローカル設定にあるすべてのツールが表示される

## `plugins` , `p`

プラグインを管理する。

```bash
rtx plugins [GLOBAL_OPTIONS] [COMMAND_OPTIONS] [COMMAND]
rtx p [GLOBAL_OPTIONS] [COMMAND_OPTIONS] [COMMAND]
```

**コマンドオプション**

- `-c` , `--core` 
組み込みのプラグインのみを対象にする。通常、これらは表示されません
- `-u` , `--urls`  
各プラグインの git url を表示する。

**コマンド**

- `install` , `i` , `a` プラグインをインストールする  。
- `link` プラグインを rtx にリンクする。
- `ls` , `list` インストールされたプラグインをリストアップする 。
- `ls-remote` , `list-remote` 利用可能なすべてのリモートプラグインをリストアップする 。
- `uninstall` プラグインを削除します。
- `update` プラグインを最新バージョンに更新します
- `help` このメッセージまたは指定されたサブコマンドのヘルプを表示します。

### `plugins install` , `plugins i` , `plugins a`

プラグインをインストールする  。

```bash
rtx plugins install [GLOBAL_OPTIONS] [COMMAND_OPTIONS] [NAME] [GIT_URL]
rtx plugins i [GLOBAL_OPTIONS] [COMMAND_OPTIONS] [NAME] [GIT_URL]
rtx plugins a [GLOBAL_OPTIONS] [COMMAND_OPTIONS] [NAME] [GIT_URL]
```

**コマンドオプション**

- `-f` , `--force` 
既にインストールされていても、強制的に再インストールする。
- `-a` , `—all` 
不足しているプラグインをすべてインストールする 
一致するショートハンドを持つプラグインのみをインストールする

**引数**

- `[NAME]` 
インストールするプラグイン名
複数のプラグインを指定することができる
例： `rtx plugins install node ruby python`
- `[GIT_URL]` 
プラグインのgit URL

### `plugins link`

プラグインを rtx にリンクする。

```bash
rtx plugins link [GLOBAL_OPTIONS] [COMMAND_OPTIONS] <NAME> [PATH]
```

**コマンドオプション**

- `-f` , `--force` 
既にインストールされていても、強制的に再インストールする。

**引数**

- `<NAME>` 
インストールするプラグイン名
複数のプラグインを指定することができる
例： `rtx plugins link node ruby python`
- `[PATH]` 
プラグインのローカルパス
例： 　.`/rtx-node`

### `plugins ls` , `plugins list`

インストールされたプラグインをリストアップする 。

```bash
rtx plugins ls [GLOBAL_OPTIONS] [COMMAND_OPTIONS]
rtx plugins list [GLOBAL_OPTIONS] [COMMAND_OPTIONS]
```

**コマンドオプション**

- `-c` , `--core` 
組み込みのプラグインのみを対象にする。通常、これらは表示されません
- `-u` , `--urls`  
各プラグインの git url を表示する。

### `plugins ls-remote` , `plugins list-remote`

利用可能なすべてのリモートプラグインをリストアップする 。

```bash
rtx plugins ls-remote [GLOBAL_OPTIONS] [COMMAND_OPTIONS]
rtx plugins list-remote [GLOBAL_OPTIONS] [COMMAND_OPTIONS]
```

**コマンドオプション**

- `-u` , `--urls`  
各プラグインの git url を表示する。
- `--only-names` 
各プラグインの名前のみを表示する。
デフォルトでは、インストールされているプラグインの横に アルタリスク（`*`）が表示される

### `plugins uninstall`

プラグインを削除します。

```bash
rtx plugins uninstall [GLOBAL_OPTIONS] <PLUGIN>...
```

**引数**

- `<PLUGIN>…` 
削除するプラグイン名
複数のプラグインを指定することができる
例： `rtx plugins uninstall node ruby python`

### `plugins update`

プラグインを最新バージョンに更新します

```bash
rtx plugins uninstall [GLOBAL_OPTIONS] [PLUGIN]...
```

**引数**

- `[PLUGIN]…` 
更新するプラグイン名
複数のプラグインを指定することができる
省略した場合はインストールされているすべてのプラグインを更新する
例： `rtx plugins update node ruby python`

## `prune`

ツールの未使用バージョンを削除する

```bash
rtx plugins prune [GLOBAL_OPTIONS] [COMMAND_OPTIONS] [PLUGIN]...
```

**コマンドオプション**

- `--dry-run`  
実際には削除しない

**引数**

- `[PLUGIN]…` 
削除するプラグインのバージョン
複数のプラグインを指定することができる
省略した場合は未使用のプラグインを削除する

## `reshim`

shim を再構築する

```bash
rtx plugins reshim [GLOBAL_OPTIONS] 
```

## `self-update`

rtx自体をアップデートする

```bash
rtx plugins self-update [GLOBAL_OPTIONS] 
```

## `settings`

設定を管理する

```bash
rtx plugins settings [GLOBAL_OPTIONS] [COMMAND]
```

**コマンド**

- `get` 現在の設定を表示する
- `ls` , `list` 現在の設定を表示する。（デフォルト）
- `set` , `add` , `create`  設定を追加/更新する  。
- `unset` , `rm` , `remove` , `delete` , `del` 設定を消去する。
- `help` このメッセージまたは指定されたサブコマンドのヘルプを表示する。

### `settings get`

現在の設定を表示する

```bash
rtx plugins settings get [GLOBAL_OPTIONS] <KEY>
```

**引数**

- `<KEY>`
表示したい設定項目のキー

### `settings ls` , `settings list`

現在の設定を表示する。

```bash
rtx plugins settings ls [GLOBAL_OPTIONS] 
rtx plugins settings list [GLOBAL_OPTIONS] 
```

### `settings set` , `settings add` , `settings create`

設定を追加/更新する。

```bash
rtx plugins settings set GLOBAL_OPTIONS] <KEY> <VALUE>
rtx plugins settings add GLOBAL_OPTIONS] <KEY> <VALUE>
rtx plugins settings create GLOBAL_OPTIONS] <KEY> <VALUE>
```

**引数**

- `<KEY>`
設定項目のキー
- `<VALUE>`
設定項目のキーに設定する値

### `settings unset` , `settings rm` , `settings remove` , `settings delete` , `settings del`

設定を消去する。

```bash
rtx plugins settings unset [GLOBAL_OPTIONS] <KEY>
rtx plugins settings rm [GLOBAL_OPTIONS] <KEY>
rtx plugins settings remove [GLOBAL_OPTIONS] <KEY>
rtx plugins settings delete [GLOBAL_OPTIONS] <KEY>
rtx plugins settings del [GLOBAL_OPTIONS] <KEY>
```

**引数**

- `<KEY>`
消去する設定項目のキー

## `global`

指定がない場合に使用するバージョンを設定する。

```bash
rtx global [GLOBAL_OPTIONS] [COMMAND_OPTIONS] [TOOL@VERSION]...
```

**コマンドオプション**

- `——pin` 
正確なバージョンを設定ファイルに保存する
例：`rtx use --pin node@20` は `~/.tool-versions` に `node 20.0.0` を保存する
- `--fuzzy` 
ファジーバージョンを設定ファイルに保存する。 
例： `rtx use --fuzzy node@20` は、 `~/.tool-versions` に `node 20` を保存する
- `——remove <TOOL>` 
設定ファイルからツールを削除する。
- `-p` , `--path <PATH>` 
設定ファイルまたはディレクトリへのパスを指定する。

**引数**

- `[TOOL@VERSION]…`
インストールするツールを指定する

## `local`

特定のディレクトリ内でだけバージョンを設定する。

```bash
rtx local [GLOBAL_OPTIONS] [COMMAND_OPTIONS] [TOOL@VERSION]...
```

**コマンドオプション**

- `-p` , `--parent` 
`.tool-versions` ファイルをカレントディレクトリだけでなく上位ディレクトリも再帰的に検索する。デフォルトでは、このコマンドはカレントディレクトリ（"`$PWD/.tool-versions`"）のみを設定する
- `——pin` 
正確なバージョンを設定ファイルに保存する
例：`rtx use --pin node@20` は `$PWD/.tool-versions` に `node 20.0.0` を保存する
- `--fuzzy` 
ファジーバージョンを設定ファイルに保存する。 
例： `rtx use --fuzzy node@20` は、 `$PWD/.tool-versions` に `node 20` を保存する
- `——remove <TOOL>` 
設定ファイルからツールを削除する。
- `-p` , `--path <PATH>` 
設定ファイルまたはディレクトリへのパスを指定する。

**引数**

- `[TOOL@VERSION]…`
インストールするツールを指定する
`@VERSION` が省略された場合は、`.tool-versions` あるいは `.rtx.toml` で設定されているバージョンを表示する

## `shell`

現在のシェルで使用するランタイムのバージョンを設定する。

```bash
rtx shell [GLOBAL_OPTIONS] [COMMAND_OPTIONS] [TOOL@VERSION]...
```

**コマンドオプション**

- `-u` , `--unset`
以前に設定されたバージョンを削除する

**引数**

- `[TOOL@VERSION]…`
インストールするツールを指定する
`@VERSION` が省略された場合は、`.tool-versions` あるいは `.rtx.toml` で設定されているバージョンを表示する

## `trust`

設定ファイルを信頼済みとしてマークする

```bash
rtx trust [GLOBAL_OPTIONS] [CONFIG_FILE]
```

**引数**

- `[CONFIG_FILE]`
設定ファイルのパス

## `uninstall`

ランタイムバージョンを削除する

```bash
rtx uninstall [GLOBAL_OPTIONS] <TOOL@VERSION>...
```

**引数**

- `<TOOL@VERSION>…`
アンインストールするツールを指定する

## `upgrade`

（実験的）古くなったツールのバージョンをアップグレードします。

```bash
rtx upgrade [GLOBAL_OPTIONS] <TOOL@VERSION>...
```

**引数**

- `<TOOL@VERSION>…`
アップグレードするツールを指定する
省略した場合は、現在使用中のツールがアップグレードされる
例： `node@20` `python@3.10`

## `use` , `u`

ローカルまたはグローバルでツールの有効なバージョンを変更します。

```bash
rtx use [GLOBAL_OPTIONS] [COMMAND_OPTIONS] <TOOL@VERSION>...
rtx u [GLOBAL_OPTIONS] [COMMAND_OPTIONS] <TOOL@VERSION>...
```

**コマンドオプション**

- `——pin` 
正確なバージョンを設定ファイルに保存する
例：`rtx use --pin node@20` は `~/.tool-versions` に `node 20.0.0` を保存する
- `--fuzzy` 
ファジーバージョンを設定ファイルに保存する。 
例： `rtx use --fuzzy node@20` は、 `~/.tool-versions` に `node 20` を保存する
- `——remove <TOOL>` 
設定ファイルからツールを削除する。
- `-g` , `--global` 
ローカルではなく、グローバルな設定ファイル（`~/.config/rtx/config.toml`）を使用する。
- `-p` , `--path <PATH>` 
設定ファイルまたはディレクトリへのパスを指定する。

**引数**

- `[TOOL@VERSION]…`
ツールのバージョンを指定する
`@VERSION` を省略した場合は、`@latest` が使用される
例： `node@20` `python@3.10`

## `version`

rtxのバージョンを表示する

```bash
rtx version [GLOBAL_OPTIONS]
```

## `where`

ランタイムのインストールパスを表示する

```bash
rtx where [GLOBAL_OPTIONS] <TOOL@VERSION>...
```

**引数**

- `<TOOL@VERSION>…`
インストールパスを表示するツールを指定する
    
    `@<PREFIX>` が指定された場合、そのプレフィックスと一致する最新のインストール済みバージョンを表示する
    それ以外の場合は、現在インストールされている有効なバージョンを表示する
    例： `node@20` `python@3.10`
    

## `which`

bin名が指すパスを表示します。

```bash
rtx which [GLOBAL_OPTIONS] [COMMAND_OPTIONS] <BIN_NAME>
```

**コマンドオプション**

- `--plugin` 
パスではなく、プラグイン名を表示する。
- `--version` 
パスの代わりにバージョンを表示する。
- `-t` , `--tool`  `<TOOL@VERSION>`
 特定のツール@バージョンを使用する。
 例：`rtx which npm --tool=node@20`

## `node`

nodeプラグインのコマンドです。

```bash
rtx node [GLOBAL_OPTIONS] [COMMAND]
```

コマンド

- `node-build` rtxの内部node-buildを使用/管理する。
- `help` このメッセージまたは指定されたサブコマンドのヘルプを表示する。

### `node node-build`

rtxの内部node-buildを使用/管理する。（通常は使用しない）

```bash
rtx node node-build [GLOBAL_OPTIONS] [args]...

rtx node node-build [-kpv] <definition> <prefix>
rtx node node-build --definitions
rtx node node-build --version
```

**引数**

- `[args]...`
内部node-build への引数

**node-build オプション**

- `-c` , `--compile` 
一致するバイナリが存在しても、強制的にコンパイルする。
- `-k` , `--keep` 
インストール後、ソースツリーを削除しない。
- `-p` , `--patch` 
ビルド前にstdinからパッチを適用する。
- `-v` , `--verbose` 
Verboseモード：コンパイル状況をstdoutに出力する。
- `-4` , `--ipv4` 
IPv4 アドレスにのみ名前解決する。
- `-6` , `--ipv6` 
IPv6 アドレスにのみ名前解決する。
- `--definitions` 
すべての組み込み定義をリストアップします。
- `--version` 
node-buildのバージョンを表示します。

**node-build 引数**

- `<definition>`
- `<prefix>`

## `help`

このメッセージまたは指定されたサブコマンドのヘルプを表示します。

```bash
rtx help [GLOBAL_OPTIONS] <COMMAND>
```

**引数**

- `<COMMAND>`
サブコマンド

## [SECURITY.md](https://github.com/jdxcode/rtx/blob/main/SECURITY.md) (抄訳）

### セキュリティポリシー

rtxは開発者ツールを管理するための便利なツールですが、そのモデルは潜在的なリスクにも開放されています。以下は、rtxの主要な領域と、現在行われているセキュリティ上の配慮、および今後必要な配慮です。

rtxをよりセキュアにする方法についてお考えがあれば、チケットを開くかメールを送ってください。

### コアCLIのセキュリティ

コアCLIの開発はGitHUb [jdxcode/rtx](https://github.com/jdxcode/rtx/) 上で行われており、一人の開発者（私、@jdxcode）だけがアクセスできます。他の開発者は、公開された Pull Requests を通してのみ貢献することができます。アクセスできる開発者の数を1人に減らすことで、鍵が漏れる可能性を最小にすることができます。

ただし、[バスファクター(Bus Facto](https://en.wikipedia.org/wiki/Bus_factor)r)の問題が発生します。もし私がある日突然死んでしまったり、開発を続けられなくなったりした場合、私のGitHubアカウントには後継者が何人か登録されており、必要であれば私のアカウントを引き継ぐことができます。

コアCLIにおける依存関係は、セキュリティに影響する要素でもあります。どのような依存関係をプロジェクトに組み込むかについては、慎重に判断するようにしています。可能な限り、Rustコミュニティで広く使われている依存関係だけを選びました。rtxをより安全にするために、機能を犠牲にしてでも依存関係を減らすためのPRや提案を歓迎します。

### rtx.pub

rtx.pubは、rtxのアセットホストです。コンパイル済みのrtx CLIバイナリをホストしたり、rtxが新しいバージョンのリリースをチェックするために使用する "[VERSION](https://rtx.pub/VERSION)"をホストするために使用されます。現在、CDN、アセット、ドメイン登録のために3つの異なるベンダーの混合でホストされています。これは、セキュリティ上の理由から単一のベンダーに集約する予定です。

### RTXプラグイン

プラグインは、潜在的な問題の最大の原因であり、最も多くの作業を行う必要がある場所です。

プラグインには3つのタイプがあります：

- [core](https://github.com/jdxcode/rtx/issues/236) 
CLIにハードコードされているプラグインです。これらは、Rustで書かれた最も一般的な言語のための公式プラグインです。
- community
GitHub [rtx-plugins](https://github.com/rtx-plugins)  にあるプラグインです。今のところ、これらのプラグインは @jdxcode が唯一のコントリビューターとなっていますが、特定のプラグインのオーナーやコラボレーターがいる場合は、将来的に変更されるかもしれません。もし、あなたのプラグインをここに移動させたいのであれば、私に相談してください。
- 実験的（external) 
他者が所有するプラグインで、shorthandレジストリにあるプラグインも含まれます。これらは、インターネットから任意のツールをインストールするよりも安全ではありません。

このプラグインはshorthandレジストリに登録されているため、`rtx install foo@` を実行することができますが、私が保証するものではありません。そのようなプラグインをビルドしている人がほとんど誰なのか見当もつきません。GitHub [rtx-plugins](https://github.com/rtx-plugins)  から来たものであれば、もっと信頼してもいいのではないでしょうか。(`rtx plugins ls-remote --urls` を持つオーナーを参照）。

時間が経てば、より多くのプラグインをrtxの完全なメンテナンスに移行させることができるはずです。環境変数 `RTX_PARANOID` を追加する予定ですが、これを`1`に設定すると、rtxができるだけ安全に動作するように変更されます（例：コアプラグインの使用のみ、アセットのGPG検証を使用するプラグインの使用のみ許可など）。

### プライバシー

現在、rtxが行う定期的な作業は、毎週行われる新バージョンのチェックだけです。rtxは（バージョン以外の）データを送信しませんが、IPアドレスを使ってrtxの（非常に）広範な使用データを推測することが可能です。環境変数 `RTX_HIDE_UPDATE_WARNING=1` でこの動作を無効にすることができます。また、自分で[コード](https://github.com/jdxcode/rtx/blob/main/src/cli/version.rs)を監査して、それが何をするのかを確認することもできます。

基本的なことですが、公開されている解析情報を見てみたいと思います。[homebrew](https://docs.brew.sh/Analytics) はこれを行うのに素晴らしい仕事をしたと思いますが、私たちは、データが匿名かつ公にアクセス可能である同様のモデルを持つことになるでしょう。そうすることで、私とプラグイン作者の両方が、効果的な機能を構築できているかどうかを知ることができます。また、rtxを使った開発を行うことで、組織からの賛同を得ることができます。（特に大きな技術系企業では、みんな数字が大好きです）

### サポートされるバージョン

サポートされるバージョンは、最新のものだけです。

### 脆弱性の報告

`security@<RTX_DOMAIN_IN_README>.pub`までメールを送ってください。

必要であれば、GPGでメッセージを暗号化することもできます：

- jdxcodeの公開鍵
    
    ```
    -----BEGIN PGP PUBLIC KEY BLOCK-----
    
    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
    1wxfuzN2+ao=
    =/CHf
    -----END PGP PUBLIC KEY BLOCK-----
    ```

## 参考資料
[Notion - 複数のランタイムバージョンをプロジェクト単位で管理できる rtx-cli の紹介](https://www.notion.so/pythonosaka/rtx-cli-9940d626b9fe4404b55e8e8e7473be5b?pvs=4)

[Notion - 複数のランタイムバージョンをプロジェクト単位で管理できる asdf の紹介](https://www.notion.so/asdf-7e63394b9def421c943b8867dbaf96f8)

[Notion - Rust製テンプレートエンジン tera ](https://www.notion.so/Rust-tera-473b6eac274a4d798d042d5601219728)

[Notion - zlib の CLIツール zclib の紹介](https://www.notion.so/zlib-CLI-zclib-665b63f7f6494291ac3ae22622450482)

[Notion - JSONとMessagePackを相互変換する  msgpack-cli の紹介](https://www.notion.so/JSON-MessagePack-msgpack-cli-f24d0a2a913040849f1a383feaf143bf)
# ライセンス

- [**MIT license**](https://github.com/The-Noah/lsfp/blob/master/LICENSE)