sudo下的npm無法升級-sudo npm -v 與 npm -v版本號是不一樣的

快上線了發現環境有問題。。。

發現問題

新增了一個上傳文件的功能,用到strongloop,需要npm install strongloop依賴包,但是到線上測試安裝時,發現總是報錯:

npm ERR! typeerror Error: Missing required argument #1
npm ERR! typeerror     at andLogAndFinish (/usr/lib/node_modules/npm/lib/fetch-package-metadata.js:31:3)
npm ERR! typeerror     at fetchPackageMetadata (/usr/lib/node_modules/npm/lib/fetch-package-metadata.js:51:22)
npm ERR! typeerror     at resolveWithNewModule (/usr/lib/node_modules/npm/lib/install/deps.js:455:12)
npm ERR! typeerror     at /usr/lib/node_modules/npm/lib/install/deps.js:456:7
npm ERR! typeerror     at /usr/lib/node_modules/npm/node_modules/iferr/index.js:13:50
npm ERR! typeerror     at /usr/lib/node_modules/npm/lib/fetch-package-metadata.js:37:12
npm ERR! typeerror     at addRequestedAndFinish (/usr/lib/node_modules/npm/lib/fetch-package-metadata.js:82:5)
npm ERR! typeerror     at returnAndAddMetadata (/usr/lib/node_modules/npm/lib/fetch-package-metadata.js:117:7)
npm ERR! typeerror     at pickVersionFromRegistryDocument (/usr/lib/node_modules/npm/lib/fetch-package-metadata.js:134:20)
npm ERR! typeerror     at /usr/lib/node_modules/npm/lib/fetch-package-metadata.js:109:7
npm ERR! typeerror This is an error with npm itself. Please report this error at:
npm ERR! typeerror     <http://github.com/npm/npm/issues>
npm ERR! Linux 4.14.77-70.59.amzn1.x86_64
npm ERR! argv "/home/ec2-user/.nvm/versions/node/v10.4.0/bin/node" "/usr/bin/npm" "install" "strongloop"
npm ERR! node v10.4.0
npm ERR! npm  v3.8.6
npm ERR! code EMISSINGARG

可以注意到npm的version是 v3.8.6,版本已經很老了!因爲上線前,有一個相同環境配置的預部署服務器做對比,預服務器上安裝都是ok的,就是npm的version是最新的。綜合查的一些資源,都是建議升級npm版本。

所以! 我們需要升級!!

出狀況了

先看下npm版本號:
sudo 下版本號爲3.8.6
直接npm,版本號爲6.4.0

[root@ ec2-user]# sudo npm -v
3.8.6

[root@ ec2-user]# npm -v
6.4.1

執行升級後,仍然,沒有升級sudo npm,只是npm -v改變了

[root@ ec2-user]# sudo npm install npm -g
/home/ec2-user/.nvm/versions/node/v10.4.0/bin/npm -> /home/ec2-user/.nvm/versions/node/v10.4.0/lib/node_modules/npm/bin/npm-cli.js
/home/ec2-user/.nvm/versions/node/v10.4.0/bin/npx -> /home/ec2-user/.nvm/versions/node/v10.4.0/lib/node_modules/npm/bin/npx-cli.js
+ [email protected]
updated 1 package in 6.051s

[root@ec2-user]# sudo npm -v
3.8.6

[root@ ec2-user]# npm -v
6.14.5

這不難受麼!不管我是執行 sudo npm install npm -g 還是npm install npm -g 結果都是一樣的!
sudo npm -v 下的版本號一直不變!!!

怎麼解決呢

頭腦風暴一下!
npm裝哪裏的呢?
which 命令!

[root@ec2-user]# which npm
/root/.nvm/versions/node/v10.4.0/bin/npm
看到這裏只是一個軟鏈,我們看看軟鏈的地址

[root@ec2-user]# ll /root/.nvm/versions/node/v10.4.0/bin/npm
lrwxrwxrwx 1 root root 38 Jun 30 03:44 /root/.nvm/versions/node/v10.4.0/bin/npm -> ../lib/node_modules/npm/bin/npm-cli.js


[root@ec2-user]# sudo which npm
/bin/npm

[root@ec2-user]# ll /bin/npm
lrwxrwxrwx 1 root root 38 Sep 23  2018 /bin/npm -> ../lib/node_modules/npm/bin/npm-cli.js

到了這裏,我們大膽猜想一下!
npm工具實質上就是一個nodejs的腳本,我們用它來管理node模塊,Fedora包管理器安裝的npm和全局安裝處理的方式差不多,在/bin/npm生成了lib/node_modules/bin/npm-cli.js的軟鏈接,我們的npm就是它!!
好!那是不是我們把/bin/npm 軟鏈到,高版本的npm的js文件上,就ok了呢?

測試一下,軟鏈一個新文件: /bin/kikitest
[root@ec2-user]# ln -s /root/.nvm/versions/node/v10.4.0/lib/node_modules/npm/bin/npm-cli.js /bin/kikitest
[root@ec2-user]# ll /bin/kikitest 
lrwxrwxrwx 1 root root 68 Jun 30 07:18 /bin/kikitest -> /root/.nvm/versions/node/v10.4.0/lib/node_modules/npm/bin/npm-cli.js

見證奇蹟的時刻了!!
成功了!!! 我們可以這麼玩,而且這樣之後,安裝都是ok的!
[root@ ec2-user]# sudo /bin/kikitest -v
6.14.5

ok!好似解決了!嘗試一下,安裝strongloop

[root@ec2-user]# sudo /bin/kikitest install strongloop

結果是成功的!!!‘’

當下是這麼解決的,重定向一下/bin/npm的軟鏈!

[root@ec2-user]# rm -rf /bin/npm
[root@ec2-user]# ln -s /root/.nvm/versions/node/v10.4.0/lib/node_modules/npm/bin/npm-cli.js /bin/npm

解決!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章