0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

nvm windowsで「Unexpected token '.'(ピリオドエラー)」を直した話

Last updated at Posted at 2022-05-19

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用になったままのようだ。
ならば、相対パスを絶対パスに書き替えれば動きそうですね。ということでお得意のバッチファイルを作成してみました。

npm_rename.bat
@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のバージョンも含むパスが変数で取れれば良かったんですけど、今回は手当たり次第だったので超絶長いパスになってしまってます。
また時間ある時に探してみます(きっとあるはず)。もし知ってる方居ましたらお気軽にコメントお願いします。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?