NPM / Error: EACCES: permission denied, scandir

15

当我输入“npm run build:prod”时

build:prod
    npm run build -- --configuration production --aot --optimization=false

我遇到了以下错误:

> fancy-name@0.0.0 build:prod
> npm run build -- --configuration production --aot --optimization=false

glob error [Error: EACCES: permission denied, scandir '/root/.npm/_logs'] {
 errno: -13,
 code: 'EACCES',
 syscall: 'scandir',
 path: '/root/.npm/_logs'
}
npm WARN logfile Error: EACCES: permission denied, scandir '/root/.npm/_logs'
npm WARN logfile  error cleaning log files [Error: EACCES: permission denied, scandir '/root/.npm/_logs'] {
npm WARN logfile   errno: -13,
npm WARN logfile   code: 'EACCES',
npm WARN logfile   syscall: 'scandir',
npm WARN logfile   path: '/root/.npm/_logs'
npm WARN logfile }
⸨⠂⠂⠂⠂⠂⠂⠂⠂⠂⠂⠂⠂⠂⠂⠂⠂⠂⠂⸩ ⠙ : WARN logfile Error: EACCES: permission denied, scandir '/root/.npm/_logs'
> fancy-name@0.0.0 build
> ng build "--configuration" "production" "--aot" "--optimization=false"

Node.js version v17.4.0 detected.file Error: EACCES: permission denied, scandir '/root/.npm/_logs'
Odd numbered Node.js versions will not enter LTS status and should not be used for production. For more information, please see https://nodejs.org/en/about/releases/.
This version of CLI is only compatible with Angular versions ^13.0.0-next || >=13.0.0 <14.0.0,ogs'
but Angular version 12.1.3 was found instead.

Please visit the link below to find instructions on how to update Angular.
https://update.angular.io/

我已经尝试删除node_module和package.json,并再次运行NPM install,但它没有起作用(Linux 4.19.0-16-cloud-amd64)。

编辑:使用chown -R root /path/of/your/project解决了问题。

3个回答

27

更新:此问题及下面的答案仅适用于NPM 7和8(更多信息)。

通过安装NPM版本>=9,此快速修复应该可以解决该问题。

npm install -g npm@latest

原始答案(适用于 Node 15-19 附带的 NPM 7 和 8)

这个错误理所当然地令人困惑;您以 root 用户身份运行 npm,但它却说您没有访问文件的权限?有一个很好的理由 :) 这些问题本质上是关于同一件事情的:

我的相当长的答案详细介绍了发生了什么,但其实质是这样的:

(NPM) ...使用这段代码来确定要作为谁运行:

const { uid, gid } = isRoot ? inferOwner.sync(cwd) : {}

并且根据 infer-owner 模块的文档所述: 根据最近存在的父级的所有者推断路径的所有者

所以如果你作为root运行NPM,你也需要将当前目录的拥有者更改为root:

chown -R root /path/of/your/project

但是所有这些麻烦都应该指向真正的解决方案:不要以root身份运行NPM。您不知道可能作为postinstall触发器或类似脚本的类型。请保持安全,仅在必要时使用root帐户,使用sudo

附录:尝试版本6或>= 9的NPM

如链接答案中所述:

此行为仅适用于NPM版本7和8。 NPM版本< 7(这些版本与Node 12-14一起提供)在以root身份运行时完全正常工作。

因此,一些快速修复方法包括:

  • npm install -g npm@latest # 使用最新版本的NPM
  • npm install -g nvm && nvm use 14 # 注意:2023年5月停止维护
  • npm install -g nvm && nvm use 18 # 使用NPM 9,对某些依赖项来说太新了?

我已经尝试更改所有者,但什么都没用 :/ ,可能是我做错了什么,但我还没有找到。 - XCA
要将所有者更改为root,您可以执行chown -R root /path/of/your/project - oligofren
3
很抱歉,我做 chown 命令时出错了,不过现在问题已经解决了,谢谢! - XCA
很遗憾,Node 14将在下个月停止维护,因此仅停留在14版本已不再是一个好的解决方案了... - steev
@steev 很好的建议。我会更新“尝试 Node 14”的部分以反映这一点。我已经在我链接到的更长的答案中做了这个(https://dev59.com/fcPra4cB1Zd3GeqPWgAL#70298239)。旧的行为已经回到了 NPM 9,所以这是最快的解决方法 :) - oligofren

1

另一种方法:使用非root用户

NPM正在尽力(参见其他答案的详细信息)避免以root身份执行任何操作。那么,不以root身份运行怎么样?您可以尝试以下操作:

  1. 添加本地用户(AMI指南),通常为adduser john.doe --disabled-password
  2. 作为新用户登录:sudo -s -u john.doe
  3. 克隆存储库:git clone https://github.com/foo/bar; cd bar
  4. 运行NPM命令:npm i;npm run build:prod

有没有其他方法可以在不获取 root 权限的情况下完成这个操作? - XCA
我在我的链接答案中发布了以root身份执行此操作的方法。我将在下面重新发布它。 - oligofren
你为什么一定要成为root用户?顺便问一下。我使用Linux已经有20年了,除了偶尔需要进行管理工作外,从来没有必要成为root用户,只要正确地操作就行了。 - oligofren
这不是我的服务器,我的“老板”说“在root中完成”,所以... x) - XCA
哈哈,如果老板这么说,而且他是那种不听取合理建议的老板,那我完全理解。幸运的是,我从未经历过这种情况。祝好运! - oligofren

-4
全局错误 [错误:EACCES:权限被拒绝,扫描目录'/root/.npm/_logs']。
这意味着它正在尝试读取'root'目录上的某些内容,这通常需要root访问权限。
请尝试像这样运行命令:
sudo npm run build:prod

额外提示:通常情况下,您不应该使用sudo运行命令。如果您来自Windows背景,请将其视为“以管理员身份运行”,只是拥有更多的特权,因此,如果您运行恶意脚本,则可以访问系统上几乎所有内容。当然,有一些JS库需要root / sudo访问才能完成它们的工作。


在较新的NPM版本中,那不会起作用。 - oligofren
你可以尝试使用Node 16吗?如果您没有正确设置权限,则sudo chown -R username:username /root/.npm/_logs可能有效。 - zedian
我正在使用 Node v17.4.0,我将尝试使用 Node 16, chown 命令无法解决错误。 - XCA
如果你的情况是这样的,也可以在这里找到解决方案:https://dev59.com/N1UM5IYBdhLWcg3wY_e2#59575266 - zedian
相同的错误在 Node 16 中出现 编辑:使用 nvm 安装 Node 也不起作用。 - XCA
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接