解决npm 全局安装某些包时报权限相关的错误

今天在Mac系统下全局安装node-sass总是报权限方面的错误。

错误信息:gyp ERR! stack Error: EACCES: permission denied, mkdir ‘/usr/local/lib/node_modules/node-sass/.node-gyp’

字面上大概意思就是没有操作这个目录的权限,然后我尝试手动把/usr/local/lib/node_modules的目录权限改成777也不行。

最后经过网上各种搜索解决办法,找到了根本原因是:

npm 出于安全考虑不支持以 root 用户运行,即使你用 root 用户身份运行了,npm 会自动转成一个叫 nobody 的用户来运行,而这个用户几乎没有任何权限。这样的话如果你脚本里有一些需要权限的操作,比如写文件(尤其是写 /root/.node-gyp),就会崩掉了。
为了避免这种情况,要么按照 npm 的规矩来,专门建一个用于运行 npm 的高权限用户;要么加 –unsafe-perm 参数,这样就不会切换到 nobody 上,运行时是哪个用户就是哪个用户,即使是 root。

知道了问题的原因就可以正确的解决了,所以把安装命令后面加上这个–unsafe-perm 参数即可。
完整的全局安装node-sass命令为:
sudo npm i -g node-sass --unsafe-perm