## 背景 現状、[[npm]]でしかインストールできないものは `npm -g install` コマンドでモジュールを管理している。しかし、[[mise]]で[[npm]]を管理している都合上、[[Node.js]]のバージョンを更新するたびに関連モジュールすべての再インストールが必要になる。これを避けたい。 そこで[[mise]]の[[npm Backend (mise)|npm Backend]]機能を使用する。 ## owl-playbookの更新 [[🦉owl-playbook]]の`provision.sh`を変更する。現状は以下のようになっている。 ```bash # miseでインストールされている全Node.jsバージョンでインストール # $1: インストール対象, $2: コマンド名($1と異なる場合のみ) function npm_install() { target="$1" command=${2:-${target}} mise use -g node@20 mise_no "${command}" && mise x -- npm i -g "${target}" mise use -g node@22 mise_no "${command}" && mise x -- npm i -g "${target}" return 0 } npm_install pyright npm_install bash-language-server npm_install @fsouza/prettierd prettierd npm_install vscode-langservers-extracted vscode-css-language-server npm_install vscode-langservers-extracted vscode-json-language-server npm_install @olrtg/emmet-language-server emmet-language-server npm_install @tailwindcss/language-server tailwindcss-language-server npm_install yaml-language-server npm_install typescript tsc npm_install typescript-language-server npm_install @vue/language-server vue-language-server npm_install svelte-language-server svelteserver ``` これを[[mise]]コマンドに置き換えていく。 ## 1つインストールしてみる。 [[Pyright]]をインストールしてみる。まずは[[npm]]でアンインストール。 ```console npm uninstall -g pyright ``` [[mise]]を使ってインストール。 ```console mise use -g npm:pyright ``` エラーになった。 ```error mise npm backend is experimental. Enable it with `mise settings set experimental true` ``` experimentalの機能を使うには設定が必要とのこと。 ```console mise settings set experimental true ``` リトライ。 ```bash $ mise use -g npm:pyright Reshimming mise 22... mise npm:[email protected] ✓ installed mise ~/.config/mise/config.toml tools: npm:[email protected] ``` ## 構造を確認する 場所を確認。 ```console $ which pyright /home/tadashi-aikawa/.local/share/mise/installs/npm-pyright/latest/bin/pyright ``` [[Node.js]]とは依存せず`npm-pyright`としてインストールされていそう。さらに確認してみる。 ```console $ ll /home/tadashi-aikawa/.local/share/mise/installs/npm-pyright/latest/bin lrwxrwxrwx - 14 Sep 17:40  pyright -> ../lib/node_modules/pyright/index.js lrwxrwxrwx - 14 Sep 17:40  pyright-langserver -> ../lib/node_modules/pyright/langserver.index.js ``` 実体は`lib`の方にありそう。`index.js`を見てみる。 ```js #!/usr/bin/env node /* eslint-disable @typescript-eslint/ban-ts-comment */ // @ts-nocheck // Stash the base directory into a global variable. global.__rootDirectory = __dirname + '/dist/'; require('./dist/pyright'); ``` ここで初めて `#!/usr/bin/env node` の指定が出てくる。現在activateされている[[Node.js]]にて実行されることが分かる。 ## パフォーマンスの懸念はあるか? 今のローカルはこういう状況。 ```console $ mise list node Plugin Version Config Source Requested node 18.15.0 node 18.19.0 node 20.12.2 node 20.15.0 node 22.5.1 node 22.6.0 (outdated) ~/.config/mise/config.toml 22 ``` [[Node.js]] `v20.15.0` の `node_modules` 配下を見ると、今まではこのように[[Pyright]]が配置されていたことが分かる。 ``` /home/tadashi-aikawa/.local/share/mise/installs/node/20.15/lib/node_modules/pyright/index.js ``` `index.js`の内容は全く同じ。 ```js #!/usr/bin/env node /* eslint-disable @typescript-eslint/ban-ts-comment */ // @ts-nocheck // Stash the base directory into a global variable. global.__rootDirectory = __dirname + '/dist/'; require('./dist/pyright'); ``` このことから **[[npm Backend (mise)|npm Backend]]の機能を使っても、shimsのようにパフォーマンスが劣化する心配はなさそう** ということが分かる。 ## すべてのNode.jsをアンインストールする すべてスッキリさせて書き直したものでインストールする。(書き直しは省略) ```console $ mise remove --all node mise [email protected] ✓ uninstalled mise [email protected] ✓ uninstalled mise [email protected] ✓ uninstalled mise [email protected] ✓ uninstalled mise [email protected] ✓ uninstalled mise [email protected] ✓ uninstalled $ mise use -g node@22 mise [email protected] ✓ installed mise ~/.config/mise/config.toml tools: [email protected] ``` このあとにインストール。 ## 懸念点 activateされている[[Node.js]]バージョンによって、利用するモジュールのバージョンを変更したい (バージョンごとに固定化したい) 場合、何もしないとできない。しかし、それらのモジュールは[[Node.js]]のバージョンよりもプロジェクトバージョンに依存すべき。それなら、ディレクトリベースの[[mise]]設定をしたほうがいい。 普段使う[[Node.js]]は最新が望ましいし、意図的に古いバージョンを使うのは開発対象がそのバージョンに対応しているという制約上の理由であることがほとんど。その場合は `mise.toml` に設定すればいい話だ。 ## 他 [[Go]]と[[pipx]]にも対応しており気になったが、それぞれ1つしかインストールしていないので experimental が外れてからにする。なお、オプションで[[uvx]]にすることも可能だとか。[[Cargo BInstall]]もいけるのか...。