nvmはnodejsのバージョン管理ツールで、複数のnodejsやnpmバージョンを使いたい場合にとても便利です。しかしWindows版ではnvmのバージョン1.1.7で以下のようなエラーが生じていました。
GitHubでも長期に渡って議論されていたようですね。
$npm init
npm ERR! Unexpected token '.'
npm ERR! A complete log of this run can be found in:
npm ERR! C:\Users\****\AppData\Local\npm-
cache\_logs\2022-05-19T13_51_46_969Z-debug-0.log
そこでなんとか直そうとした履歴を残していきます
仕様
Windows10
nvm v1.1.7(v1.1.9でもエラー出る人は居るみたいです...)
node v16.15.0
目標
以下のスペックを満たせばミッションコンプリート
$nvm -v
Running version 1.1.7.
$node -v
v16.15.0 (2022年5月現在のLTS)
$npm -v
8.5.5
$npm init
package name: (test) #この行が出てほしい
解決策
とりあえず「Unexpected token '.'」が出たときのエラーログはこんな感じ
28 verbose stack C:\Users\****\AppData\Roaming\nvm\v16.15.0\node_modules\npm\node_modules\libnpmexec:1
28 verbose stack ../workspaces/libnpmexec
28 verbose stack ^
28 verbose stack
なるほど、一つ上のディレクトリを示すピリオドが反応していないと。ならバッチファイルで書き換えよう。
どうやらシンボリックリンクがlinux用になったままのようだ。
ならば、相対パスを絶対パスに書き替えれば動きそうですね。ということでお得意のバッチファイルを作成してみました。
@echo off
rem キーボード入力
set INPUT_VERSION=
set /P INPUT_VERSION="対象のnodejsバージョンを入力してください(例:16.15.0): "
rem 遅延環境変数を設定
setlocal ENABLEDELAYEDEXPANSION
rem ディレクトリ移動
cd %NVM_HOME%\v%INPUT_VERSION%\node_modules\npm\node_modules
rem 今回対象となるlibnpmで始まるファイルをfor文で処理
for %%a in (libnpm*) do (
rem 変数に上書きしたいパスを代入
set line="%NVM_HOME%\v%INPUT_VERSION%\node_modules\npm\workspaces\%%a"
rem ファイルを上書き
echo !line! > %%a
)
echo 上書きに成功しました。
pause
exit /b
endlocal
ということで5時間掛かりましたが、なんとかシンボリックリンクとの闘いは終結しました!
Windows特有の二重バックスラッシュを付けたり、スラッシュにしたり、いろいろ試しましたが、やはり絶対パスをダブルクォートで括るのが正攻法でしたね。
いや~解決してよかったよかった!
もし自身の環境でnvmの入れ直しを行いたくない場合などにはぜひご利用ください!!!
p.s.
本当はnodejsのバージョンも含むパスが変数で取れれば良かったんですけど、今回は手当たり次第だったので超絶長いパスになってしまってます。
また時間ある時に探してみます(きっとあるはず)。もし知ってる方居ましたらお気軽にコメントお願いします。