Quantcast
Channel: Bashタグが付けられた新着記事 - Qiita
Viewing all articles
Browse latest Browse all 2804

nodebrewのNODE_PATHを設定する奴

$
0
0

概要

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のrequirenode_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ファイルの末尾に記述すると有効になったので、両方設定しておくのが間違いないのかもしれない。


Viewing all articles
Browse latest Browse all 2804

Trending Articles