🍊

mise (旧 rtx) で脱 node-build (asdf)

2024/01/05に公開

年明けはまず環境整備から、ということで今年は mise を導入することにした。

https://mise.jdx.dev/

去年まで rtx とか rtx-cli という名前でやってた Rust 実装の asdf 代替の多用途バージョン管理ツール。この年明けに急に mise にリネームしたよ、というニュースが流れてきて、気になって見てみたら良さそうだった。

一般的な解説は "rtx" でググると日本語記事も出てくるのでそっちを見て欲しいけど、個人的な asdf に対するメリットはこのあたり。

  • とにかく速い
  • asdf は Node の最新バージョンの反映が node-build 依存で、更新が数日遅れることがあった
  • asdf はコマンド体系が謎だった(自分には)
    • 例えば v20 系の最新をインストールするのに latest:20 とか入力する必要があった
    • nodeじゃなくてnodejs って入れるのも微妙だった
    • mise では mise install node@20 で OK
    • でも基本は asdf ベースなのであまり新しく覚える感は少ない
  • asdf は shim の管理が面倒、npm 周りの rehash 漏れでつまづくことが何度かあった
    • mise は PATH 方式なのでそこの心配は不要
  • そのまま使いたい asdf の機能はちゃんと残している(センスが良い)
    • 例えば .node-version などのいわゆる legacy file 対応がデフォルト有効(asdf はデフォルト無効)

特に node-build 周りの問題を解消できたのは非常にスッキリした(詳細後述)。

逆に個人的なデメリット、できなかったことはこのあたり。

前提として、自分は asdf をそこまでヘビーに使っておらず、Node, Python, Ruby など一般的な言語ランタイムのインストールとバージョン管理だけに使っていた。今回も mise に外部のプラグインは入れず、コアだけで使えている。また現時点では direnv 系の機能は試していない。

そういうシンプルな使い方をする限り、あまり詰まるポイントはなかった。

VS Code などの IDE 統合について、一般に IDE 等との連携では shim 方式より PATH 方式の方が相性が悪いとされていて、公式ドキュメント には色々書いてある。が、自分は追加設定なしで VS Code 内のアレコレが動いているので今のところ気にせず使っている。

Node.js のバージョン定義ファイルとキャッシュ関連の Tips

mise では、自分で Node などコアなランタイムのパース済みバージョン定義ファイルを配信していて(例: https://rtx-versions.jdx.dev/node, https://rtx-versions.jdx.dev/python )、これを高速に fetch/cache して使っている。リアルタイムに fetch してると気づかないぐらいめちゃくちゃ速い。

もしこの独自定義ファイルの更新が遅いようなら、Node 本家のバージョン定義を直接 fetch することもできる。この辺の処理でやっていて、

https://github.com/jdx/mise/blob/49027919665af8a568c60356f8022d757a26e68e/src/plugins/core/node.rs#L33

つまり環境変数 MISE_NODE_MIRROR_URL=https://nodejs.org/dist/ をつければ本家最新のバージョン定義が参照できる(最後の / は必須)。

ただし、fetch したバージョン定義ファイルは 1 時間ローカルにキャッシュされるので、強制的に fetch させるには MISE_FETCH_REMOTE_VERSIONS_CACHE=0s を付けるか、キャッシュ削除が必要。キャッシュディレクトリは mise cache すれば確認できる。macOS だとキャッシュはデフォルトで以下のパスに message pack で保存されていた。

/Users/teppeis/Library/Caches/mise/node/remote_versions.msgpack.z

こいつを消せば OK。


2024 年はさらにツールの Rust 化が進みそうですなー。
というわけで、今年もよろしくお願いします。

Discussion