概要
nodebrewをインストールするとパスを通せと言われる
その通りに操作すると環境変数PATHに対してのパスが通ってNode.jsは使用可能になる。
しかしそれでは不十分で、
NODE_PATHへの設定周りは記載されていないがとても重要である。
これに関してPCのセットアップの度にあちこち探す事になっているので備忘録として残す。
まずはnodebrew越しに普通にインストール
$ curl -L git.io/nodebrew | perl - setup
# (意訳)下記を~/.bashrc等に貼り付けてパスを通してね!
export PATH=$HOME/.nodebrew/current/bin:$PATH
$ vim ~/.bashrc
$ cat ~/.bashrc
# ~~中略~~
export PATH=$HOME/.nodebrew/current/bin:$PATH
$ nodebrew install-binary latest
$ nodebrew use latest
$ node -v
# バージョン10なんとかみたいな数字が表示
$ npm -v
# バージョン6なんとかみたいな数字が表示
ここまでは問題なし、問題はここから
インストールされたNode.jsを利用する
コアなNode.jsユーザーでなければ気が付かないと思うが、
nodebrew越しにインストールすると-g
オプションで導入したパッケージが使えない。
$ echo $NODE_PATH
$ npm install -g lodash
$ node
> var _ = require('lodash')
Uncaught Error: Cannot find module 'lodash'
Require stack:
- <repl>
at Function.Module._resolveFilename (internal/modules/cjs/loader.js:1029:15)
at Function.Module._load (internal/modules/cjs/loader.js:898:27)
at Module.require (internal/modules/cjs/loader.js:1089:19)
at require (internal/modules/cjs/helpers.js:73:18) {
code: 'MODULE_NOT_FOUND',
requireStack: [ '<repl>' ]
}
Node.jsのrequire
はnode_modules
というディレクトリ名を探すという事を行いながらライブラリを探す。
カレントディレクトリに存在しなければ1階層上で探すという事を繰り返すのだがそれでもパッケージが存在しなければ、グローバルの領域も探しにいく。
このルールに関しては下記の公式ドキュメント参照
Loading from the global folders
その時に重要になるのがNODE_PATHという環境変数だ。
Node.js用のPATH
環境変数のように動作し、ライブラリが存在しない場合、最後の駆け込み寺的な存在となる。
Node.jsを実行ファイルでインストールすると、
グローバル指定でインストールしたnpmパッケージのPATHは通っているが、
nodebrew越しにインストールするとグローバル指定でインストールしたパッケージが使えない。
NODE_PATHの説明をサボっているnodebrewのせい
設定方法
Bash
.bashrcの末尾にNODE_PATHの環境変数も設定してあげると解決
export PATH=$HOME/.nodebrew/current/bin:$PATH
export NODE_PATH=$HOME/.nodebrew/current/lib/node_modules
nodebrewの挙動として~/.nodebrew/current
にシンボリックリンクを張る。
これはnodebrew use vx.y.z
で指定したバージョンになる。
その実体は~/nodebrew/node/vx.y.z/
であり、
npmで追加されたライブラリは~/nodebrew/node/vx.y.z/lib/node_modules
配下である。
まぁ~/.nodebrew
の中に入って探せばそれらしいものがすぐ見つかるはず
確認方法
REPLを立ち上げてglobal.module.paths
を実行して値を確認する。
参考記事: Node.js グローバルインストールでハマった
$ node
Welcome to Node.js v13.6.0.
Type ".help" for more information.
> global.module.paths
[
'/home/miyabi/repl/node_modules',
'/home/miyabi/node_modules',
'/home/node_modules',
'/node_modules',
'/home/miyabi/.nodebrew/current/lib/node_modules', # <- 設定した内容だ!!
'/home/miyabi/.node_modules',
'/home/miyabi/.node_libraries',
'/home/miyabi/.nodebrew/node/v13.6.0/lib/node'
]
【おまけ】 nodebrewから乗り換えました
こんな大変な事しなくてもVoltaで良くね?
Voltaは2020年12月にバージョン1がリリースされた
かなり注目されているパッケージ管理ツール
実際に使ってみたところNODE_PATHもよしなにやってくれて良い感じだった
これからnodebrewでバージョン管理しようと思っている人は検討してみると良いかもしれない