npm升级失败的处理方式

0x81 惨痛遭遇

系统上的npm是fedora仓库里的3.10.10,使用dnf安装nodejs的时候作为弱依赖被同时安装的,我从来只是用它安装其他的工具,一直没有手动升级过它,它一直是跟随着包管理工具升级。今天用outdated看来一下哪些模块可以升级,发现npm有4.5.0可用,于是我就尝试升级了它sudo npm update npm -g,然后悲剧出现了,升级失败后npm用不了了。

0x82 问题根源

我便去npm全局模块的安装目录看了一下,目录是/usr/lib/node_modules/,进入npm文件夹我发现什么都没有了,仔细阅读了升级日志,发现升级的时候先把原来的文件删除掉再放入新的文件,应该就是这个时候出现了问题。于是我尝试用dnf重新安装了npm,然后npm就正常了。

0x83 一个可行的升级方案

npm工具实质上就是一个nodejs的脚本,我们用它来管理node模块,Fedora包管理器安装的npm和全局安装处理的方式差不多,在/usr/bin/npm生成了/usr/lib/node_modules/bin/npm-cli.js的软链接,我们的npm就是它。由于升级会导致npm被破坏,所以我就拷贝了一份npm3,卸载了包管理器安装的npm,然后使用绝对路径的npm-cli.js脚本全局安装了npm4,之后为新安装的npm手动建立软链接就可以使用了。

这样虽然很拙,但是确实有效,其实和手动下载npm压缩包的效果是一样的,npm升级失败更好的解决方法我还没有找到,找到后再正确的处理它。