読者です 読者をやめる 読者になる 読者になる

Windowsではnpm linkで正しくPathが通らない問題について (v0.12.5まですべてっぽい)

プログラミング 開発

通常、npm install -gによってnpmのコマンドラインツールをグローバルにインストールする場合は以下のようなコマンドになります。

@IF EXIST "%~dp0\node.exe" (
  "%~dp0\node.exe"  "%~dp0\node_modules\made-cafe\bin\main.js" %*
) ELSE (
  node  "%~dp0\node_modules\made-cafe\bin\main.js" %*
)

 

#!/bin/sh
basedir=`dirname "$0"`

case `uname` in
    *CYGWIN*) basedir=`cygpath -w "$basedir"`;;
esac

if [ -x "$basedir/node" ]; then
  "$basedir/node"  "$basedir/node_modules/made-cafe/bin/main.js"" "$@"
  ret=$?
else
  node  "$basedir/node_modules/made-cafe/bin/main.js" "$@"
  ret=$?
fi
exit $ret

ですが、開発中のコマンドラインツールや、npmで外部から拾ってこれないパッケージの場合はnpm linkコマンドを使うのですが、この場合次のようにコマンドが生成されます。

"%~dp0\node_modules\made-cafe\bin\main.js" %*
"$basedir/node_modules/made-cafe/bin/main.js" "$@"
exit $?

この場合、JSファイルを実行するデフォルトの関連付けはWindows Script Hostになっているため、JavaScriptのいろいろなんて定義されなくて死にます。そうじゃなくても、IDEなんかが関連付けされていたりする場合、いきなりIDEが起動してすごい腹立ちます。

解決策

実は上の方はnpm install -gしたものに合わせて自分で書き換えたものなのですが、つまるところほかの自分がグローバルにインストールしているnodeのコマンドに合わせるといいと思います。最悪は別に 最初に nodeつけるだけでも動くと思います。 まあ、自分はVimでしかソースを弄ることはないので、JSファイルの関連付けをnodeにするというのも一つの手段かもしれませんね。検証してないのでわかりませんがその場合ちゃんとコマンドプロンプト上で動くのかわからないので面倒そうです。

nodistならnodistのインストールディレクトリのbinディレクトリにコマンドが置いてあるのでそこを弄ると良いでしょう。普通にNode.jsをインストールしている場合はおそらく%USERPROFILE%\AppData\Roaming\npm直下に無造作に置かれていてnode_modulesにsymbolic linkがあるだけなのでいい感じに編集してください。

割とハマりかけたのでみなさんはちゃんとLinuxとかMacで開発してください