[[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くらい速くなっててもおかしくない。
Not found
This page does not exist