MacOS
使用命令行执行【创建文件】、【创建文件夹】,【npm install】等操作时,如果带了sudo
,会将它们的【所属用户】改成root
。
踩坑记录
根据官网文档,一步一步启动运行 Egg.js
1 | mkdir svg-vuejs-backend && cd svg-vuejs-backend |
报错如下:
大概意思就是我们运行项目的时候, node_modules 需要打开某个文件夹去干某些事情,但是没有打开文件夹的权限,所以报错提示权限不足
查看 node_modules 文件夹的权限
可以看到【所属用户】是 root,而 npm 出于安全考虑不支持以 root 用户运行,即使你用 root 用户身份运行了,npm 会自动转成一个叫 nobody 的用户来运行,而这个用户几乎没有任何权限。这样的话如果脚本里有一些需要权限的操作,比如写文件,就会崩掉。
解决方案
更改 node_modules 所属用户
1 | sudo chown -R liukun:staff node_modules |
当然也可以在根源解决问题,就是在 npm install 装依赖的时候,不带上sudo,自然 node_modules 就不会变成 root 用户,也不会出现这种报错,但是有一种特殊情况,有时候我们在 npm install 时,它也会需要到写入权限,这时候不用 sudo 也会报错,所以为了避免这种情况,我们在装依赖的时候依然使用 sudo,装完依赖之后,通过命令更改 node_modules 的权限最为稳妥。
关于 npm –unsafe-perm 参数
npm 加 –unsafe-perm 参数,这样就不会切换到 nobody 上,运行时是哪个用户就是哪个用户
1 | npm install --unsafe-perm |
但是这个参数在 npm v6.11.0 中被标记为废弃、在 v7.0.0 中被移除,已经无需指定,现在运行时是哪个用户就是哪个用户。