2022/02/27

Windows10とnvm

JavaScript を使うことがある。主に node.js で。

node.js を Windows で使う場合、node.js のインストーラをダウンロードしてインストールするだろう。
しかし、環境によって node.js のバージョンを指定されることがある。
Java で jdk8 だの jdk11 だのの選択があるのと同じようなものだ。
個人で開発するときならまだよいのだが、プロジェクトでやるときには同じバージョンをインストールしていないと面倒なことになりかねない。

 

Linux で作業するときには nvm を使っていた。

nvm-sh/nvm: Node Version Manager - POSIX-compliant bash script to manage multiple active node.js versions
https://github.com/nvm-sh/nvm

POSIXコンパチブルと書いてあるように、Windows だと使えない。
似たようなものとして nvm-windows がある。

coreybutler/nvm-windows: A node.js version management utility for Windows. Ironically written in Go.
https://github.com/coreybutler/nvm-windows

GitHub からバイナリをダウンロードしてインストールすればよいのだが、Chocolatey で環境を作るようにしているのでそちらでインストールを今までしていた。
ただ、これを書いている時点(2022/02/27)で GitHub でのバージョンは 1.1.9 なのだが、Chocolatey の方は 1.1.51.1.7 だった。
なので、比較的最近まで 1.1.7 をインストールして使っていた。

 

最近まで 1つの node.js バージョン(v14系)しか必要としていなかったのだが、v16系を使う必要が出てきた。
ようやく nvm が nvm っぽいことをするときがやってきたのだ。
v16.14.0 をインストールすることはできたのだが、 npm i するとエラーになるのだ。

エラーメッセージがなんだったかもう忘れてしまったのだが、1.1.9 をインストールするとよいという回答が見つかったので GitHub 版にしたらエラーが出なくなった。

その後 1.1.7 に入れ替えても動いたのだが、ようわからんので 1.1.9 のままにしている。
おそらく Chocolatey の nvmは chocolatey-nvm-windows が使われているのだと思う。

なら chocolatey の nvm でバージョンを 1.1.9 と指定したらいけるんじゃないの?と試してみたのだが、nvm 1.1.5 の方でバージョンを指定しても 1.1.7 がインストールされてしまった。ダメか。


node.js を普通にインストーラーでインストールすると、 Program Files\node.js というディレクトリを作ってインストールされる。
nvm 1.1.7 を使うと Program Files\node.js はショートカットというかたぶんシンボリックリンクになって、本体が ProgramData\node.js に置かれるようになっていたと思う。

 

nvm 1.1.9 では AppData\Roaming\nvm にインストールされた。
しかし「nvm use」をそのまま実行するとエラーになる。

>nvm use 16.14.0
exit status 1: �A�N�Z�X�����ۂ����܂����B

読めないのだ・・・。

管理者権限を持った状態で nvm use すると動作する。
そのときに Program Files\node.js にシンボリックリンクが張られた。

やっぱりオリジナルが Program Files\node.js にインストールするようになっているので避けられないのだろうか。
これはこれで面倒だ。


Microsoft のページに代替のマネージャーが載っていた。

代替のバージョン マネージャー
https://docs.microsoft.com/ja-jp/windows/dev-environment/javascript/nodejs-on-windows#alternative-version-managers

vscode とも連携できるようなので nvs をインストールしてみた。
Chocolatey からもできる。それに Windows 以外でも使える。

jasongin/nvs: Node Version Switcher - A cross-platform tool for switching between versions and forks of Node.js
https://github.com/jasongin/nvs

コマンドは nvm と同じような感じだが、 nvs add を使うのがよいのかな。

>nvs add 16.14.0
Downloading [#############################################################] 100%
Extracting  [#############################################################] 100%

>nvs use 16.14.0
PATH += %LOCALAPPDATA%\nvs\node\16.14.0\x64

>node --version
v16.14.0

ほう。
nvs use はその場で PATH に追加するだけなので権限は必要にならなかった。

 

それになんと、ディレクトリごとに自動で切り替える機能もある。
bash と powershell 向けと書いてあるが・・・あれ、cmd.exe では使えないのだろうか。

>nvs auto on
Automatic switching is not supported from a Windows Command Prompt.
Use PowerShell instead.

ダメか。
なんか powershell は苦手なのだが、node.js で使うだけだから我慢しよう。
文字色がダメなんだと思う。「node --version」だとこうなるのだ。

image

背景が真っ黒なら、まだなんとかなるか。

image

色をカスタマイズしたいと言うよりは、色分けを止めてほしいだけなのだが、見つからなかった。
それに、vscode を起動して自動的に Terminal が希望したディレクトリを開いた場合には auto が効かないようだったので無理して powershell を使う必要もなさそうだ。

 

手動で行う場合は、.node-version というファイルを作ってバージョン名を書いておく。
そして nvs use と打つと設定してくれる。
.nvmrc でもよいように書いてあったのだが、そちらだと動かなかった。 cmd.exe だったからか?
まあいいや。

Linux でやるときには nvm と direnv を組み合わせていたのだけど、 nvs ならこれだけで切り替えられるので便利そうだ。

 

あとはまあ、無意識のうちに nvm と打ち込んでしまうのが難点というかまだ慣れていないというかだな。