9
9

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.

nodebrewのNODE_PATHを設定する奴

Last updated at Posted at 2020-01-09

概要

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のrequirenode_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でバージョン管理しようと思っている人は検討してみると良いかもしれない

参考記事: Node.js のバージョン管理ツール Volta を使ってみる | DevelopersIO

9
9
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
9
9

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?