20
18

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

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

Last updated at Posted at 2023-05-31

はじめに

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

Rustの環境構築やツールのインストール方法はこちら を参照してください。

rtx-cli について

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

コマンド名は rtx です。

デモ

次のデモは、rtxを使用して異なるバージョンのnodeをインストールする例です。which node を呼び出すと、shim ではなく、nodeへの実際のパスが得られることに注目してください。
rtx_demo.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=productionAWS_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の作者はパフォーマンスの問題について素晴らしい記事を書いています。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では、プラグインがインストールされていない場合、新しいランタイムをインストールするためにいくつかのステップが必要になりす。

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

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

rtx local node latest:20

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

rtx install python@3.9 python@3.10 python@3.11

asdfは特に堅苦しく、学ぶのが難しいと感じています。また、asdf list allasdf 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 になっていて、現在作業中です。

インストール

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

$ cargo install rtx-cli

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

$ cargo binstall rtx-cli

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

シェルの設定ファイル

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

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

上記は、Bash の場合です。

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

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

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

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

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

  • Ubuntu / Debian

    apt install dirmngr gpg curl gawk
    
  • CentOS / Rocky Linux / AlmaLinux

    yum install gnupg2 curl gawk
    # あるいは
    dnf install gnupg2 curl gawk
    
  • macOS

    brew install gpg gawk
    

使用方法

rtx [OPTIONS] <COMMAND>

オプション

  • -h , —-help
    ヘルプ情報を表示する
  • -V , —-version
    バージョン情報を表示する
  • --install-missing
    足りないツールを自動でインストールする
  • -j , --jobs <JOBS>
    並行してインストールするプラグインとランタイムの数
    デフォルト:利用可能なコア数
  • --log-level <LEVEL>
    ログ出力の冗長性を設定する
    指定可能な値:errorwarninfotracedebug
    デフォルト: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 のログレベルを指定する

    指定可能な値:errorwarninfotracedebug

     RTX_DEBUG=1RTX_TRACE=1, RTX_QUIET=1 
    コマンドラインオプション --log-level でも設定できる

  • RTX_LOG_FILE

    logファイルのパスを指定する
    絵dフォルト:=~/rtx.log

  • RTX_LOG_FILE_LEVEL

    RTX_LOG_LEVEL と似ているが、ログファイルでの出力レベルを指定する
    これは、ログを保存したいが、ディスプレイには表示させない場合に有効
    指定可能な値:errorwarninfotracedebug

  • RTX_ALWAYS_KEEP_DOWNLOAD

    1 を設定すると、ダウンロードしたアーカイブを常に保持する
    デフォルトでは、インストール後に削除される。

  • RTX_ALWAYS_KEEP_INSTALL

    1 を設定すると、インストールディレクトリを常に保持する
    デフォルトでは、失敗すると削除される。

  • RTX_VERBOSE

    1 を設定すると、rtx install と rtx plugin install 時にインストール出力を表示する
    これは、RTX_DEBUG=1 と同じように動作するべきで、同じもののために2つの設定があるわけではないが、今のところ別になっている。

  • RTX_ASDF_COMPAT

    1 を設定すると、rtx localrtx 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ファイルを与える:

    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_fileyes で設定しておくことをおすすめします。

  • 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-pythonvirtualenv='.venv' のように、プラグインに引数を渡す。
  • カスタムプラグインのURを指定する。

.rtx.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 で以下のように定義されているとします。

[tools]
python = '3.10'

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

[tools]
python = '3.11'

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

~/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 のエントリーを設定します。

[env]
NODE_ENV = 'production'

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

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

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

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

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

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

env_file = '.env'

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

[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では、これらはデフォルトで有効になっています。

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

$ 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 ファイルとよく似ていますが、すべてのディレクトリから参照されます。

[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.tomlnode@20.xnode lts/hydrogen と設定できるようにしたい場合です。

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

[alias.node]
my_custom_20 = '20'

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

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

#!/usr/bin/env bash

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

プラグイン

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

組み込みのプラグインの省略記法のリスト、プラグインを作成する方法、またはプラグインがどのように動作するかについての詳細は、asdf を紹介した資料も参考にしてください。

プラグインオプション

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

[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)に以下を追加して、実験的機能を有効化します。

[settings]
experimental = true

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

$ rtx plugins -c
node
python

asdf-pythonrtx-python を使用したいときは、明示的にURLを指定してプラグインを追加ます。

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

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

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

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

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

$ 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つのパッケージをリストアップしたファイルをセットします。

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

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

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

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

numpy
scipy

virtualenvの自動生成・有効化

Pythonコアプラグインはvirtualenvをサポートしていて、以下のような .rtx.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はこのディレクトリにプラグインをインストールします。プラグインを作業している場合は、実行して手動でシンボリックリンクすることをお勧めします:

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)のために、このディレクトリへの他のシンボリックリンクが作成されます。たとえば、次のようになります:

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-clizclib が必要)

$ 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クレートでパースされ、非常に強力です。例えば、以下のようにすると、プロジェクトのディレクトリ名を取得することができます:

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

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

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

環境設定(実験的)

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

また、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です。

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

shim の挙動については、asdf を紹介した資料を参考にしてください。

direnv

direnv と 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関数を構築します:

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

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

use rtx

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

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

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を使用する例:

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 を以下のように変更することができます。

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"

使用例

ヘルプ表示

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

$ rtx

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

$ rtx install python

これは、次のように処理されます。

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

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

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

プラグインの一覧

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

$ rtx plugin list-remote

プラグインを追加

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

$ rtx plugin install python

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

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

$ rtx plugin list
python

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

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

$ rtx ls-remote python

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

$ rtx install python@latest

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

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

$ rtx latest python
3.11.3

$ rtx latest python@3.10
3.10.11

$ rtx latest python@miniforge3
miniforge3-22.11.1-4

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

$ rtx install python@3.10.11

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

$ rtx install python@miniforge3

注意:
Anaconda Python (miniconda, miniforge 含む)をインストールした場合は、conda のbase環境がデフォルトで有効にならないようにしてください。
conda config --set auto_activate_base false

$ rtx shell python@miniforge3
$ conda init ${SHELL##*/}
$ conda config --set auto_activate_base false
$ rtx shell -u python@miniforge3

ツールのインストール

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

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

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

バージョンを参照する

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

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

$ 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)オプションを与えて実行します。

$ 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。

$ rtx current
python 3.10.11
pdm 2.7.0

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

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

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が有効になるようにする例です。

$ rtx local python 3.11.3

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

$ rtx use python 3.11.3

この場合は、カレントディレクトリの .rtx.toml に書き込まれます。

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

スクリプトからの利用

.tool-versions.rtx.toml を設定をしなくても、shebangでツールやそのバージョンを指定することができます:

#!/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 testrtx x -- ./my_script.sh のような感じです。

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

rtx activate は、(ほとんどのシェルで)rtxと呼ばれるシェル関数も作成します。これは、rtx shellrtx deactivateeval "$(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=debugRTX_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_proxyhttps_proxy の環境変数を設定するだけです。これらは小文字にする必要があります。

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

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

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

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

asdfは、rtxがベースとして使用する短縮表記のインデックスを維持しています。これは、rtxがリリースされるたびに定期的に更新されます。このリポジトリは、ここのコードベースに直接保存されています。このファイルの下部には、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 とは若干異なります。

rtx install node@20.0.0 
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を呼び出す必要があります。

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

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

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

rtxは console.rs クレートを使用しており、clicolors の仕様に準拠していて、次の環境変数の設定に従いカラー出力を制御することができます。

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

rtxは安全なのでしょうか?

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

ドキュメント

rtx のヘルプメッセージ

% 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>
    ログ出力の冗長性を設定する
    指定可能な値:errorwarninfotracedebug
    デフォルト:info
  • -r , --raw
    stdin/stdout/stderr を直接ユーザーへパイプする.
    —jobs=1 として実行される

activate

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

rtx activate [GLOBAL_OPTIONS] [COMMAND_OPTIONS] [SHELL_TYPE]

コマンドオプション

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

引数

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

alias , a

エイリアスを管理する

rtx alias [GLOBAL_OPTIONS] [COMMAND]

コマンド

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

alias get

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

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

引数

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

alias ls , alias list

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

rtx alias ls [GLOBAL_OPTIONS]
rtx alias list [GLOBAL_OPTIONS] 

コマンドオプション

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

alias set , alias add , alias create

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

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

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

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

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

rtx bin-paths [GLOBAL_OPTIONS] 

cache

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

rtx cache [GLOBAL_OPTIONS] [COMMAND]

コマンド

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

cache clear , cache c

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

rtx cache clear [GLOBAL_OPTIONS]
rtx cache c [GLOBAL_OPTIONS]

completion

シェルの補完を生成する

rtx completion [GLOBAL_OPTIONS] [SHELL_TYPE]

引数

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

current

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

rtx current [GLOBAL_OPTIONS] [PLUGIN]

引数

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

deactivate

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

rtx deactivate [GLOBAL_OPTIONS] 

direnv

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

rtx direnv [GLOBAL_OPTIONS] [COMMAND]

コマンド

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

direnv activate

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

rtx direnv activate [GLOBAL_OPTIONS]

doctor

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

rtx doctor [GLOBAL_OPTIONS]

env , e

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

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

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

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と関連するデータをすべて削除する。

rtx implode [GLOBAL_OPTIONS] [COMMAND_OPTIONS]

コマンドオプション

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

install , i

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

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

コマンドオプション

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

引数

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

latest

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

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

引数

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

ls , list

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

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

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

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

引数

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

outdated

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

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

引数

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

plugins , p

プラグインを管理する。

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

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

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 にリンクする。

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

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

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

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

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

コマンドオプション

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

plugins uninstall

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

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

引数

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

plugins update

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

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

引数

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

prune

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

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

コマンドオプション

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

引数

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

reshim

shim を再構築する

rtx plugins reshim [GLOBAL_OPTIONS] 

self-update

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

rtx plugins self-update [GLOBAL_OPTIONS] 

settings

設定を管理する

rtx plugins settings [GLOBAL_OPTIONS] [COMMAND]

コマンド

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

settings get

現在の設定を表示する

rtx plugins settings get [GLOBAL_OPTIONS] <KEY>

引数

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

settings ls , settings list

現在の設定を表示する。

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

settings set , settings add , settings create

設定を追加/更新する。

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

設定を消去する。

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

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

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

コマンドオプション

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

引数

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

local

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

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

コマンドオプション

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

引数

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

shell

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

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

コマンドオプション

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

引数

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

trust

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

rtx trust [GLOBAL_OPTIONS] [CONFIG_FILE]

引数

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

uninstall

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

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

引数

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

upgrade

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

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

引数

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

use , u

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

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

コマンドオプション

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

引数

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

version

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

rtx version [GLOBAL_OPTIONS]

where

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

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

引数

  • <TOOL@VERSION>…
    インストールパスを表示するツールを指定する

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

which

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

rtx which [GLOBAL_OPTIONS] [COMMAND_OPTIONS] <BIN_NAME>

コマンドオプション

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

node

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

rtx node [GLOBAL_OPTIONS] [COMMAND]

コマンド

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

node node-build

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

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

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

rtx help [GLOBAL_OPTIONS] <COMMAND>

引数

  • <COMMAND>
    サブコマンド

SECURITY.md (抄訳)

セキュリティポリシー

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

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

コアCLIのセキュリティ

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

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

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

rtx.pub

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

RTXプラグイン

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

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

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

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

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

プライバシー

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

基本的なことですが、公開されている解析情報を見てみたいと思います。homebrew はこれを行うのに素晴らしい仕事をしたと思いますが、私たちは、データが匿名かつ公にアクセス可能である同様のモデルを持つことになるでしょう。そうすることで、私とプラグイン作者の両方が、効果的な機能を構築できているかどうかを知ることができます。また、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 の紹介

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

Notion - Rust製テンプレートエンジン tera

Notion - zlib の CLIツール zclib の紹介

Notion - JSONとMessagePackを相互変換する msgpack-cli の紹介

ライセンス

20
18
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
20
18

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?