はじめに
先日の記事で、Node.jsの32bit版が必要だったのでインストールした話を書きました。何かを見て、32bit版と64bit版は共存可能と思っていましたが、Node.jsの公式サイトにある通常のインストーラーを使うと、前にインストールされているものはアンインストールされ、新しくインストールするものに綺麗に置き換わっていることがわかりました。32bit→64bitでも、64bit→32bitでも同じ。私はインストール時にフォルダ名を変えたりしてたけど、しっかり消えていたし、パスもお掃除されていました。インストーラーが賢く、共存できません。
ということで、Nodeのバージョン管理プログラムのnvmを使って共存させることにしました。ここでは、そのインストールと、使い方などを説明します。
とにかくnvmの使い方だけ知りたい方は、4. nvm周辺でよく使うコマンドへどうぞ。
nvmとは
nvm(Node Version Manager)は、Node.jsの複数のバージョンを簡単にインストール・切り替えできるコマンドラインツールです。主に開発環境で、異なるプロジェクトごとに適切なNode.jsのバージョンを管理するために使用されます。
nvmのインストール
1. githubからインストーラーをダウンロード
- Releases · coreybutler/nvm-windows
- 今回私がダウンロードしたバージョンは、1.2.2
2. インストーラーを実行
- パスはそのまま
- nvmのインストール先
- Nodeの各バージョンのシンボリックリンクを置くフォルダ(詳細は後述)
- デスクトップ通知もそのまま
- Emailは空欄
- インストールされ、PowerShellが開く
-
nvm version
と打ってみる- まさかのnvmが存在しないエラー
- なんのために開くの
-
- PowerShellを閉じて、自分でPowerShellを起動
-
nvm version
と打ってみる-
1.2.2
→OK - ・・・まぁいいけど
-
-
3. シンボリックリンクの話
3.1. そもそもシンボリックリンクとは
「シンボリックリンク」はWindowsではあまり出てきませんが、Linuxの話ではよく出てきます。でもWindowsにも実はきちんと実装されています。ショートカットのようなもので、あたかもそこに存在しているかのように動作させられます。
「親フォルダ>子フォルダ>プログラム」というフォルダにプログラムがあるとしたいとき、「子フォルダ」が全然別の場所にあっても、子の「シンボリックリンク」を親フォルダに作っておくと、子フォルダがあるかのようにアクセスできる、というもの。
3.2. nvmでのシンボリックリンクの使い方
nvmでは
- まず、使いたいNodeのバージョンをインストールします
- つぎに、インストール済みのNodeのバージョン(複数)の中から、「このバージョンを使う!」と指定します
- そうすると、コマンドで
node
と打った時に、指定したバージョンが動きます
これを実現するために、「シンボリックリンク」を使っています。nvmをインストールしたときに指定した2つのパス(①nvmのインストール先と、②シンボリックリンクのパス)で、①には様々なバージョンのNode がフォルダを分けて格納され、②に今使うバージョンの「シンボリックリンク」 が格納されます。
nvmでは、「このバージョンを使う!」と指定したら、「シンボリックリンク」が作り直されます。
Nodeを実行するときはいつもC:\nvm4w\nodejs\node.exe
と呼ぶんだけど、nodejs
がシンボリックリンクで、どこかのバージョンのフォルダを指している、という仕組みです。
実行に関しては、割と単純な仕組みだと思います。(バージョン情報の管理とか、インストールの仕組みとか、大変な部分も多いと思いますが)
4. nvm周辺でよく使うコマンド
4.1. 各バージョンのNodeをインストール
-
nvm list available
- インストールできるバージョンのリスト表示
-
nvm install 22.13.1
- バージョンを指定してインストール
-
nvm install 22.13.1 32
- 32bit版の22.12.0をインストール
- 指定しないときは、OSに沿う(今どき普通は64bit)
-
nvm install 22.13.1 all
- 64bit版と32bit版の両方ともインストール
- (2025/1/25 v1.2.2で、うまく動かないかも)
-
nvm install lts
- LTSを(バージョンの数値は調べず)インストール
4.2. バージョンを選んで使う
-
nvm list
- インストール済みのバージョンをリストアップ
-
use
で指示できるバージョン
-
nvm use 22.13.1
- 指定したバージョン(ここでは22.13.1)を使う
- シンボリックリンクが作られる
-
nvm use 22.13.1 32
- 32bit版の指定したバージョン(ここでは22.13.1)を使う
- (2025/1/25 v1.2.2で、うまく動かないかも)
-
node -p "process.arch"
- 今動いている
node
が、32bit版か64bit版かを表示 - 64bit版のとき:
x64
- 32bit版のとき:
ia32
- 今動いている
-
nvm off
- シンボリックリンクを消す(
node
が使えなくなる) - 使う場面はよくわからない、誤作動防止?
- シンボリックリンクを消す(
4.3. "うまく動かないかも"について
64bit版と32bit版、両方とも最新のバージョンを使おうと、all
でインストールしてみたのですが、use
のとき、こんなエラーメッセージが。
PS C:\Users\myname> nvm use 22.13.1 32
activation error: Did you mean node v22.13.1 (32-bit)?
If so, type "nvm use 22.13.1 32" to use it.
目をこすって確認しましたが、コピペで実行しても同じなので、私の間違いではないのでしょう。原因はわかりません。32bit版がインストールされていないか、all
でも実は共存できないか、切り替えができないか、、、。
対策として、1つ前のLTSのバージョンである22.12.0
は32bit指定でインストール(nvm install 22.12.0 32
)したら、nvm use 22.12.0 32
でうまくいきました。今はバージョンにこだわりがあるわけではないので、とりあえずそれでいいやと。
5. nvmで切り替えずに、32bit版を使う
切り替え方はわかったけど、私が先日やりたかった環境は、サーバーのexpress.jsは32bit版で、クライアントのReactは64bit版。それを1台のパソコンで。
そうすると、ローカルで両方のバージョンを同時に実行できないといけなくて、シンボリックリンクで切り替える方法では無理。
ということで、nvm use
では通常使う64bit版にしておき、クライアントはそれを使う。サーバーの32bit版は、シンボリックリンク先のフォルダへ直接PATHを設定したら動きました。
$env:Path = "C:\Users\myname\AppData\Local\nvm\v22.12.0;$env:Path"
どっちみち、単純に複数インストールして共存できるならこの方法だったので、ちょっと遠回りして、便利ツール(nvm)を知って、元の位置に戻ったという感じ。特別効率よくなったわけではありませんが、共存できなかったものを共存できるようになったということでよしとします。
おわりに
32bit版を入れてパスを確認したら、64bit版のパスが消えていて64bit版が動くなったことに実は気づいてました。でもプログラム自体はあるだろうと思って、確認せず後回しにしてました。後で確認してみるとなくて、64bit版をインストールし直したら、32bit版がなくなったということで、今回の話でした😇
こういうことは、ちょっとした知識があるとなんとかクリアできるけど、躓く人は多いんだろうなぁと思いました。(でも32bit版や複数バージョンをインストールしようとする人は、その知識がない人はいないか)
AIでいろいろできるようになりつつある中、こういうトラブルもそのうち解消できるんでしょうか。こういう個別の事情みたいな話は、今はまだちょっと解決できる気がしません。動かなくなったプログラムに対して「🤖いい感じにOSの設定を変更して修復しておきました~」と言われるのも気持ち悪すぎる。でもそうなるのかなぁ。なるんだろうなぁ。
では、よきハンドメイド共存ライフを~👯♂️