[[asdf]]を使って[[Ubuntu]]([[WSL]])環境の構築をしていたが、[[mise]]に移行してみる記録。 ## 経緯 年末年始にrtxが[[mise]]にリネームされたという記事を見た。 <div class="link-card-v2"> <div class="link-card-v2-site"> <img class="link-card-v2-site-icon" src="https://anatofuz.hatenablog.com/icon/favicon" /> <span class="link-card-v2-site-name">Acme::AnaTofuZ->new;</span> </div> <div class="link-card-v2-title"> asdfコンパチのバージョン管理ツールrtxがmiseにリネームされていた - Acme::AnaTofuZ->new; </div> <div class="link-card-v2-content"> TL;DR asdf互換のRust製のバージョン管理ツールのrtxがmiseにリネームされてるよ brewもrtxではもう入らなくなっている(miseが入る) すでにrtxをbrewで入れていた場合はbrew upgrade ... </div> <img class="link-card-v2-image" src="https://ogimage.blog.st-hatena.com/8599973812278688225/6801883189072076668/1704341177" /> <a href="https://anatofuz.hatenablog.com/entry/2024/01/03/211505"></a> </div> rtxが[[asdf]]クローンなのはなんとなく知っていたが、記事から[[mise]]の特徴やドキュメントを見たところ、[[asdf]]から移行したくなったのがきっかけ。 ## miseを使ってみたくなったポイント 公式ドキュメントより気になったポイントを抽出。 <div class="link-card-v2"> <div class="link-card-v2-site"> <img class="link-card-v2-site-icon" src="https://mise.jdx.dev/favicon.ico" /> <span class="link-card-v2-site-name">mise.jdx.dev</span> </div> <div class="link-card-v2-title"> Comparison to asdf | mise-en-place </div> <div class="link-card-v2-content"> mise-en-place documentation </div> <a href="https://mise.jdx.dev/dev-tools/comparison-to-asdf.html"></a> </div> ### UX 特にインストールコマンドがシンプル。 #### asdf ```console asdf plugin add node asdf install node latest:20 asdf local node latest:20 ``` #### mise ```console mise use --global node@20 ``` ### オーバーヘッド どちらがいいとは一概に言えない気がするが、ディレクトリ変更時のオーバーヘッドが許容できる(差分に気づかない)なら、[[mise]]の方がいい気はする。 | 項目 | [[asdf]] | [[mise]] | | ---- | ---- | ---- | | ランタイム呼び出し | 120ms以下 | 0 | | ディレクトリ変更時 | 0? | 4~20ms | [[asdf]]のオーバーヘッドに関するIssueは以下。 <div class="link-card-v2"> <div class="link-card-v2-site"> <img class="link-card-v2-site-icon" src="https://github.githubassets.com/favicons/favicon.svg" /> <span class="link-card-v2-site-name">GitHub</span> </div> <div class="link-card-v2-title"> asdf shims adding too much time to use them in a shell prompt · Issue #290 · asdf-vm/asdf </div> <div class="link-card-v2-content"> Hello, Not sure if this is the right place to report this issue but I've noticed using asdf is quite slow for ex ... </div> <img class="link-card-v2-image" src="https://opengraph.githubassets.com/14a2e4c0662ffd4604d7720fc9e2dc793064a29d861109f3161d18326976032a/asdf-vm/asdf/issues/290" /> <a href="https://github.com/asdf-vm/asdf/issues/290"></a> </div> ## miseのインストール <div class="link-card-v2"> <div class="link-card-v2-site"> <img class="link-card-v2-site-icon" src="https://mise.jdx.dev/favicon.ico" /> <span class="link-card-v2-site-name">mise.jdx.dev</span> </div> <div class="link-card-v2-title"> Getting Started | mise-en-place </div> <div class="link-card-v2-content"> mise-en-place documentation </div> <a href="https://mise.jdx.dev/getting-started.html"></a> </div> ```console curl https://mise.jdx.dev/install.sh | sh echo 'eval "$(~/.local/bin/mise activate zsh)"' >> ~/.zshrc ``` 再起動して ```console $ mise --version 2024.1.7 linux-x64 (292e4ac 2024-01-05) ``` ## 使用するツールの指定 [[mise]]はインストールとバージョン指定をまとめて `mise use --global` コマンドで行う。ためしに[[bat]]コマンドでやってみる。 ```console $ mise use --global -y bat mise bat is defined in ~/.tool-versions which overrides the global config (~/.config/mise/config.toml) mise ~/.config/mise/config.toml tools: bat@latest $ bat --version bat 0.24.0 (fc95468) ``` > [!positive] たしかに[[asdf]]よりも直感的で簡単 ## asdfからのマイグレーション [[asdf]]からの移行方法について、公式ドキュメントのFAQに記載がある。 <div class="link-card-v2"> <div class="link-card-v2-site"> <img class="link-card-v2-site-icon" src="https://mise.jdx.dev/favicon.ico" /> <span class="link-card-v2-site-name">mise.jdx.dev</span> </div> <div class="link-card-v2-title"> FAQs | mise-en-place </div> <div class="link-card-v2-content"> mise-en-place documentation </div> <a href="https://mise.jdx.dev/faq.html#how-do-i-migrate-from-asdf"></a> </div> が、ここでは[[asdf]]でインストールしたものをアンインストールし、[[mise]]に移行する方法を採用してみる。 ### asdfでインストールされたランタイムのアンインストール 先に洗いだしておく。 ```console $ asdf list awscli *2.13.33 2.13.34 bat No versions installed broot *1.25.2 bun *1.0.3 1.0.4 delta *0.16.5 deno *1.37.1 eza *0.13.1 gitui *0.24.3 golang 1.21.3 *1.21.4 java *corretto-21.0.1.12.1 jq *1.7 lazydocker *0.23.1 lazygit *0.40.2 neovim *0.9.4 nodejs *18.18.0 python *3.10.13 3.11.6 3.12.0 ripgrep *13.0.0 shellcheck *0.9.0 starship *1.16.0 task *3.30.1 watchexec *1.23.0 zoxide *0.9.2 ``` `aws uninstall`コマンドを使って[[asdfでアンインストール]]していく。 - [[Starship]]はプロンプトが見にくくなるので残しておく - golangは権限の問題で消せなかったので保留 - [x] awscli - [x] bat - [x] broot - [x] bun - [x] delta - [x] deno - [x] eza - [x] gitui - [ ] golang - [x] java - [x] jq - [x] lazydocker - [x] lazygit - [x] neovim - [x] nodejs - [x] python - [x] ripgrep - [x] shellcheck - [ ] starship - [x] task - [x] watchexec - [x] zoxide ### `.tool-versions`の削除 [[Starship]]の設定を残して中身を削除。 ```console echo "starship 1.16.0" > ~/.tool-versions ``` ### miseからインストール 以下を[[グローバルにツールをインストール (mise)|グローバルにツールをインストール]]していく。 ```console mise use --global -y ツール@バージョン ``` 複数指定も可能だが、ここでは1つ1つインストールしていく。 | ツール | バージョン | 要求バージョン | | ---------- | ---------- | -------------- | | awscli | 2.15.8 | latest | | bat | 0.24.0 | latest | | broot | ??? | | | bun | 1.0.21 | latest | | delta | 0.16.5 | latest | | deno | | | | eza | 0.17.0 | latest | | fd | 9.0.0 | latest | | fzf | 0.45.0 | latest | | gitui | | | | go | TODO | | | java | | | | jq | 1.7.1 | latest | | lazydocker | ??? | | | lazygit | 0.40.2 | latest | | neovim | 0.9.5 | latest | | nodejs | 18.19.0 | 18 | | python | 3.12.1 | latest | | ripgrep | 14.1.0 | latest | | shellcheck | 0.9.0 | latest | | starship | 1.17.1 | latest | | task | 3.33.1 | latest | | watchexec | 1.25.1 | latest | | zoxide | 0.9.2 | latest | ### asdfのアンインストール > [[asdfをアンインストール]] [[🦉owl-playbook]]から`asdf.sh`を削除。 それから以下を削除。 ```console sudo rm -rf "${ASDF_DATA_DIR:-$HOME/.asdf}" rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc" ``` ### インストールのトラブル解消 うまくインストール・設定されなかったものの対処をしていく。 #### starship/zoxide シェル起動時に[[Starship]]や[[zoxide]]が初期化されない。以下のメッセージが出る。 ```error No version is set for command starship Consider adding one of the following versions in your config file at /home/tadashi-aikawa/.tool-versions starship 1.16.0 ``` [[asdfをアンインストール]]してしまえば問題は解消するが、シェル立ち上げ時に新たな問題が発生する。 ```error zsh: command not found: starship zsh: command not found: zoxide ``` [[Starship]]や[[zoxide]]の初期化スクリプト内で、[[mise]]によるランタイムが解決しないっぽい。これを解消するには、初期化コマンドで`mise exec --`を指定すればよい。 ```diff - eval "$(starship init zsh)" - eval "$(zoxide init zsh)" + eval "$(mise exec -- starship init zsh)" + eval "$(mise exec -- zoxide init zsh)" ``` もしくはaliasを使って ```bash eval "$(mise x -- starship init zsh)" eval "$(mise x -- zoxide init zsh)" ``` > [!thinking] もうちょっといいやり方ありそうだけど。。。 #### broot/lazydocker インストールできなかったので。 ```console $ mise use --global broot mise No repository found for plugin broot mise Run with --verbose or MISE_VERBOSE=1 for more information ``` プラグインの明示的なインストールが必要そう。 ```console mise plugin install https://github.com/cmur2/asdf-broot.git mise use --global broot ``` ```console mise plugin install https://github.com/comdotlinux/asdf-lazydocker.git mise use --global lazydocker ``` #### fzf 以前に[[fzf]]をインストールしたときの設定でエラー。 ```error /home/tadashi-aikawa/.fzf.zsh:source:13: no such file or directory: /home/tadashi-aikawa/.fzf/shell/key-bindings.zsh ``` ```console rm ~/.fzf.zsh ``` ### 最終的な結果 ```console $ mise list Plugin Version Config Source Requested awscli 2.15.8 ~/.config/mise/config.toml latest bat 0.24.0 ~/.config/mise/config.toml latest broot 1.32.0 ~/.config/mise/config.toml latest bun 1.0.21 ~/.config/mise/config.toml latest delta 0.16.5 ~/.config/mise/config.toml latest eza 0.17.0 ~/.config/mise/config.toml latest fd 9.0.0 ~/.config/mise/config.toml latest jq 1.7.1 ~/.config/mise/config.toml latest lazydocker 0.23.1 ~/.config/mise/config.toml latest lazygit 0.40.2 ~/.config/mise/config.toml latest neovim 0.9.5 ~/.config/mise/config.toml latest node 18.19.0 ~/.config/mise/config.toml 18 python 3.12.1 ~/.config/mise/config.toml latest ripgrep 14.1.0 ~/.config/mise/config.toml latest shellcheck 0.9.0 ~/.config/mise/config.toml latest starship 1.17.1 ~/.config/mise/config.toml latest task 3.33.1 ~/.config/mise/config.toml latest watchexec 1.25.1 ~/.config/mise/config.toml latest zoxide 0.9.2 ~/.config/mise/config.toml latest ``` ## owl-playbookの整理 コマンドによる移行は完了したので、[[🦉owl-playbook]]の`provision.sh`をキレイにする。[[asdf]]と違って[[mise]]のコマンドには基本冪等性があるため、シンプルになりそう。 以下の関数は不要になる。 ```bash # $1: package name, $2: version $3?: url function asdf_install() { asdf plugin add "$1" "${3:-""}" asdf install "$1" "$2" asdf global "$1" "$2" } ``` [[asdf]]のインストール処理を削除。 ```bash # asdfインストール no asdf && { git clone https://github.com/asdf-vm/asdf.git ~/.asdf --branch v0.13.1; # shellcheck disable=SC1091 source "$UBUNTU_MNT"/bashrc/asdf.sh; } ln -snf "$UBUNTU_MNT"/bashrc/asdf.sh ~/.asdf.sh; ensure_bashrc "source ~/.asdf.sh"; ln -snf "$UBUNTU_MNT"/zshrc/asdf.sh ~/.asdfz.sh; ensure_zshrc "source ~/.asdfz.sh"; ``` 代わりに[[mise]]のインストール処理を追加。 ```bash # miseインストール no mise && { curl https://mise.jdx.dev/install.sh | sh # shellcheck disable=SC1091 source "$UBUNTU_MNT"/bashrc/mise.sh; } ln -snf "$UBUNTU_MNT"/bashrc/mise.sh ~/.mise.sh; ensure_bashrc "source ~/.mise.sh"; ln -snf "$UBUNTU_MNT"/zshrc/mise.sh ~/.misez.sh; ensure_zshrc "source ~/.misez.sh"; ``` ## 速度比較 [[🦉Another Quick Switcher]]配下で`starship explain`を実行したときの速度比較。 | 内訳 | [[asdf]] | [[mise]] | | -------------- | -------- | -------- | | Character | 1ms未満 | 1ms未満 | | cwd | 1ms | 1ms | | Current branch | 1ms未満 | 1ms未満 | | NodeJS version | **52ms** | **3ms** | | Current shell | 1ms未満 | 1ms未満 | 50msくらい速くなってる。[[Starship]]のプロンプト表示にも同じくらいオーバーヘッドがかかっていると仮定すると100msくらい速くなっててもおかしくない。