Node.js グローバルインストールでハマった
簡単にいうとNode.js グローバルインストールにハマりました。いわゆるパスを通すのに苦労した話です。
tl;dr
Node.jsでグローバルインストールしたモジュールが実行環境によって参照できない時の調査ポイント
- npm root -g で、モジュールのパスを確認
- NODE_PATH にモジュールのパスを追加
- VSCode の場合は.vscode/launch.json に NODE_PATH を追加
問題 グローバルインストールしたモジュールが読み込めない
shell, サードパーティモジュールをインストールする。
npm i -g 3rd_party_module
index.js 呼び出しするも失敗。
const a = require('3rd_party_module')
// 読み込みに失敗する
// 🚨Error: Cannot find module '3rd_party_module'
解決方法
$NODE_PATHにグローバルインストールされたモジュールのパスを通せば良い。グローバルインストールのパスがNode.jsのrequire()メソッドから参照されるためには、そのパスがglobal.module.pathsに入っている必要がある。まずはそれを確認する。
shell, グローバルインストールされたモジュールの検索対象となるパス一覧を照会する。
$ node
> global.module.paths
[ '/opt/jarvis/repl/node_modules',
'/opt/jarvis/node_modules',
'/opt/node_modules',
'/node_modules',
'/root/.node_modules',
'/root/.node_libraries',
'/usr/lib/node' ]
> .exit # node を終了
shell, 次に先ほどグローバルインストールしたサードパーティモジュールのパスを確認する。
# モジュールがグローバルインストールされているパス確認
$ npm root -g
/usr/local/lib/node_modules
shell, global.module.pathsに入っていないので、追加する。そうするには$NODE_PATHという環境変数に追加する。
$ NODE_PATH="npm root -g"
# 確認
$ node
> global.module.paths
[ '/usr/lib/node_modules/repl/node_modules',
'/usr/local/lib/node_modules', 🌟追加された!
'/usr/node_modules',
# ・・・以下略
※ Macの場合は、ダブルクォーテーションだとNODE_PATH = npm root -gとなるのでで以下のようにすること。
// .bash_profileに設定
NODE_PATH=`npm root -g`
export NODE_PATH
shell, 環境変数を反映
$ source ~/.bash_profile
$ echo $NODE_PATH
/usr/local/lib/node_modules... # O.K.
Dockerfile, Dockerを使う場合は、このパスをDockerfileに定義する。
ENV NODE_PATH /usr/lib/node_modules
VSCodeでパスが通らない
しかし、VS Codeから実行すると、グローバルインストールしたモジュールが読み込まれない...。色々調べたら、launch.json に 環境変数追加してやればいいみたい。
.vscode/launch.json
~~~~~ 中略 ~~~~~
{
"type": "node",
"request": "launch",
"name": "VSCodeでのデバッグ",
"program": "${workspaceFolder}/nodejsproject/index_from_vscode.js",
"env": {
"NODE_PATH": "/usr/local/lib/node_modules" 🌟 ここ!
}
}
~~~~~ 中略 ~~~~~
いくつか変数っぽいのは使えるのかな〜と思って、"${npm root -g}" を設定してみたけど"npm root -g"がNODE_PATHとして設定されるだけだったので仕方なく直打ちです。
この記事が気に入ったらサポートをしてみませんか?