MacOS 使用命令行执行【创建文件】、【创建文件夹】,【npm install】等操作时,如果带了 sudo,会将它们的【所属用户】改成 root

踩坑记录

根据官网文档,一步一步启动运行 Egg.js

1
2
3
4
mkdir svg-vuejs-backend && cd svg-vuejs-backend
npm init egg --type=ts
sudo npm install
npm run dev

报错如下:

大概意思就是我们运行项目的时候, 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 中被移除,已经无需指定,现在运行时是哪个用户就是哪个用户。