読者です 読者をやめる 読者になる 読者になる

clock-up-blog

go-mi-tech

npm update -g したら npm が使えなくなった

node.js CentOS パッケージ管理

概要

npm update -g したら npm が使えなくなってしまったお話。
「これが解決策」という確信が持てない状態の対症療法なので、あまり内容は整理されてないです。

環境情報

  • CentOS 6.6 64bit
  • npm 2.1.17 (更新後。更新前はどうだったか覚えていない)

npm update -g したら npm が使えなくなってしまった

全更新するお( ^ω^)

# npm update -g
…
/usr/bin/npm -> /usr/lib/node_modules/npm/bin/npm-cli.js
npm ERR! 
npm ERR! Additional logging details can be found in:
npm ERR!     /root/npm-debug.log
npm ERR! not ok code 0

(゚ω゚)…

# npm install -g express
-bash: /usr/bin/npm: No such file or directory

(((゚ω゚)))…

# sudo su -
# npm
-bash: npm: command not found

「なお、この npm は自動的に消滅する」という言葉が頭に浮かんだ。

対策(対症療法)

yum全更新

# yum -y update
…
No Packages marked for Update

特に更新が必要なパッケージは無かった。

npm入れ直す

# yum -y install npm
…
Package npm-1.3.6-5.el6.noarch already installed and latest version
Nothing to do

# npm
-bash: npm: command not found

yum の通知によると「already installed」とのことだが、やはり npm は見つからない。

一度消して入れ直すことにする。

# yum -y remove npm
…
Removed:
  npm.noarch 0:1.3.6-5.el6

Complete!

# yum -y install npm
Installed:
  npm.noarch 0:1.3.6-5.el6

Complete!

ファイルの存在は復旧したようだ。

# npm

module.js:340
    throw err;
          ^
Error: Cannot find module 'which'
    at Function.Module._resolveFilename (module.js:338:15)
    at Function.Module._load (module.js:280:25)
    at Module.require (module.js:364:17)
    at require (module.js:380:17)
    at /usr/lib/node_modules/npm/lib/npm.js:25:13
    at Object.<anonymous> (/usr/lib/node_modules/npm/lib/npm.js:518:3)
    at Module._compile (module.js:456:26)
    at Object.Module._extensions..js (module.js:474:10)
    at Module.load (module.js:356:32)
    at Function.Module._load (module.js:312:12)

…が、実行エラー。

nodejs-which を入れる

「Cannot find module 'which'」と言われているので。

# yum -y install nodejs-which
…
Package nodejs-which-1.0.5-8.el6.noarch already installed and latest version
Nothing to do

しかし既に入っていた。

ピンポイントな Issue を見つける。install.sh の実行。

problem updating npm · Issue #7036 · npm/npm · GitHub

curl https://www.npmjs.org/install.sh | sh

御意。

# curl https://www.npmjs.org/install.sh     
Moved Permanently: https://www.npmjs.com/install.sh

リダイレクトされてるので、「-L」オプションが必要っぽい。

# curl -L https://www.npmjs.org/install.sh | sh
…
npm cannot be installed without node.js.
Install node first, and then try again.

Maybe node is installed, but not in the PATH?
Note that running as sudo can change envs.

PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin

nodeが見つからないと言われる。

# node
> 

node はある。

install.sh を見てみる。

…
# make sure that node exists
node=`which node 2>&1`
ret=$?
if [ $ret -eq 0 ] && [ -x "$node" ]; then
  (exit 0)
else
  echo "npm cannot be installed without node.js." >&2
  echo "Install node first, and then try again." >&2
  echo "" >&2
  echo "Maybe node is installed, but not in the PATH?" >&2
  echo "Note that running as sudo can change envs." >&2
  echo ""
  echo "PATH=$PATH" >&2
  exit $ret
fi
…

「which node」が失敗しているっぽい。

which コマンドを復旧する

which コマンドの存在を確認する。

# which
-bash: /usr/bin/which: No such file or directory

# yum -y install which
…
Package which-2.19-6.el6.x86_64 already installed and latest version
Nothing to do

yum の通知は which がインストール済みであることを伝えているが、実際には which ファイルそのものが無くなっている。

which を入れ直す。

# yum -y remove which
Removed:
  which.x86_64 0:2.19-6.el6
…
Complete!

# yum -y install which
…
Installed:
  which.x86_64 0:2.19-6.el6

Complete!

# which
Usage: /usr/bin/which [options] [--] COMMAND [...]

OK。which は復旧した。

install.sh を再度試行。

# curl -L https://www.npmjs.org/install.sh | sh
…
Written by John Gilmore and Jay Fenlason.
install npm@latest
fetching: http://registry.npmjs.org/npm/-/npm-2.1.17.tgz
unbuild npm@1.3.6
/usr/bin/npm -> /usr/lib/node_modules/npm/bin/npm-cli.js
npm@2.1.17 /usr/lib/node_modules/npm
It worked

OK。install.sh は実行完了した。

# npm

Usage: npm <command>
…

OK。npm コマンドも復旧した。

おしまい

根本の原因はよく理解していないけど、復旧したのでとにかく良し。

});