Node.js
npm

グローバルにインストールしたnode moduleがnot foundになる時の対処

More than 3 years have passed since last update.

いつのまにかグローバルにインストールしていたはずのbowerやgrunt(grunt-cli)コマンドを叩くとnot foundって言われてしまうようになっていました。

復旧しましたが、同じような方がいらっしゃるかも知れないので、メモ的に残しておきます。
(あくまで僕はこれで復旧しました、というだけなので、他の方には当てはまらないかもしれません。)

環境

  • OS : Mac OSX Marvericks
  • npm: 1.3.11

bowerコマンドが使えなくなった例

▶ which bower
bower not found

node moduleがグローバルにインストールされているか調べる

まずは下記コマンドでグローバルのnode_modulesディレクトリの場所を調べます。

npm root -g

表示されたディレクトリの中にmoduleがいれば、インストールは正常です。

▶ ll /opt/boxen/nodenv/versions/v0.10/lib/node_modules
drwxr-xr-x  18 nobody         staff   612B  8 13 21:59 bower
..

pathを確認する

インストールができているのに実行できなければ、パスが通っていないのでは、と思い至ります。僕はこれでした。

まずは下記コマンドでnpmがグローバルで使用しているディレクトリを調べます。

npm bin -g

表示されたディレクトリの中身を確認します。

npmでインストールしたコマンドラインツールの実行スクリプトは、ここにsymlinkが貼られるはずです。

▶ ll /opt/boxen/nodenv/versions/v0.10/bin
lrwxr-xr-x  1 root           staff    35B  8 13 21:59 bower -> ../lib/node_modules/bower/bin/bower
..

ここまで正常なら、pathを通せば実行できるようになるはずです。

以下のコードではnpm bin -gの結果にpathを通すようにしています。

export PATH=$PATH:`npm bin -g`

補足

グローバルのnpm rootやnpm binの場所はnpm config set prefix /foo/bar/pathで変更可能です。
npm config set prefix /usr/localとすれば/usr/local/lib/node_modulesがインストール先になります。