概要
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 require -g lodash
$ node
> _ = require('lodash');{ Error: Cannot find module 'lodaash'
at Function.Module._resolveFilename (internal/modules/cjs/loader.js:587:15)
at Function.Module._load (internal/modules/cjs/loader.js:513:25)
at Module.require (internal/modules/cjs/loader.js:643:17)
at require (internal/modules/cjs/helpers.js:22:18) code: 'MODULE_NOT_FOUND'}
Node.jsのrequire
はnode_modules
というディレクトリ名を探すという事を行いながらライブラリを探す。
カレントディレクトリに存在しなければ1階層上で探すという事を繰り返すのだがそれでもパッケージが存在しなければ、グローバルの領域も探しにいく。
このルールに関しては下記の公式ドキュメント参照
Loading from the global folders
その時に重要になるのがNODE_PATHという環境変数だ。
Node.js用のPATH
環境変数のように動作し、ライブラリが存在しない場合、まるで魔法のようにそこから取得くれる。
Node.jsを実行ファイルでインストールすると、
グローバル指定でインストールしたnpmパッケージのPATHは通っているが、
nodebrew越しにインストールするとグローバル指定でインストールしたパッケージが使えないのはだいたいこれのせい。
設定方法
Bash
.bashrcの末尾にNODE_PATHの環境変数も設定してあげるだけ
export PATH=$HOME/.nodebrew/current/bin:$PATHexport NODE_PATH=$HOME/.nodebrew/current/lib/node_modules
fish-shell
set -U
オプションを使えば半永久に残るユニバーサル変数に保存されるので、コンフィグファイルへの保存等は必要無し。
単に下記を実行するだけ。
$ set -U fish_user_paths $HOME/.nodebrew/current/bin $fish_user_paths
$ set -U NODE_PATH $HOME/.nodebrew/current/lib/node_modules
確認方法
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']
Ubuntu環境ではBash→fish-shellの場合はnode
コマンドでREPLを立ち上げた場合、set -U NODE_PATH
で指定したディレクトリにパスが通らなかった。
代わりに.bashrcファイルの末尾に記述すると有効になったので、両方設定しておくのが間違いないのかもしれない。