npm 命令 - sudo 与否?

Posted

技术标签:

【中文标题】npm 命令 - sudo 与否?【英文标题】:npm command - sudo or not? 【发布时间】:2013-05-19 10:08:49 【问题描述】:

目前我总是运行sudo npm install <package-name>,但据我所知这是不正确的。

我希望有机会不以 root/Administrator 身份使用它。 我听从了一些建议并使用了这个命令sudo chown -R <username> ~/.npm,但它不起作用......

例如,它是我的npm install jade 的输出

...
npm http 200 https://registry.npmjs.org/amdefine
npm http GET https://registry.npmjs.org/amdefine/-/amdefine-0.0.5.tgz
npm http 200 https://registry.npmjs.org/amdefine/-/amdefine-0.0.5.tgz
npm ERR! Error: EACCES, symlink '../jade/bin/jade'
npm ERR!   [Error: EACCES, symlink '../jade/bin/jade'] errno: 3, code: 'EACCES', path: '../jade/bin/jade' 
npm ERR! 
npm ERR! Please try running this command again as root/Administrator.

如您所见,下载成功开始但随后失败..

我想知道在 npm 上禁止 sudo 的最佳方法是什么?

【问题讨论】:

【参考方案1】:

在没有sudo 的情况下,npm install -g 节点模块是可能的(也是可取的)。

检查您的/usr/local/share/npm/bin 文件夹的权限。我已经通过 brew 安装了 node 和 npm(没有sudo),并且那个特定的文件夹最终归 root 拥有。

这样一劳永逸地修复了它:

$ sudo chown $(whoami) /usr/local/share/npm/bin

(至于使用 npm 禁止 sudo:您必须为此调整 npm。您自己的节点代码可以使用 https://npmjs.org/package/sudo-block、npm install sudo-block

编辑:即使这样可行,我也不再使用 -g。而是使用前缀(参见下一个答案),或者更好的是使用 NIX https://unix.stackexchange.com/a/381797(即使在 OSX 上)

【讨论】:

我必须更改 /usr/local/bin 和 /usr/local/lib/node_modules 的权限 @TelmoDias 我也必须这样做,看来 npm 可能更改了它用于安装全局包的目录 这是一个糟糕的一般答案,因为这会导致用户能够修改全局 PATH 中的二进制文件的安全问题。第二个答案更好。 @PureW 我不反对。我越来越多地将包留在用户或项目文件夹中。尽管如此,该建议仍然比使用sudo 更好。 -1 回答,参见LFH:/usr 是可共享的只读数据。这意味着 /usr 应该可以在各种符合 FHS 的主机之间共享,并且不能被写入。任何特定于主机或随时间变化的信息都存储在其他地方。大型软件包不得使用 /usr 层次结构下的直接子目录。【参考方案2】:

在我看来是指定 npm 前缀最简洁的方式:

npm config set prefix ~/.node_modules

然后将以下内容添加到您的 .bash_profile

export PATH=$HOME/.node_modules/bin:$PATH

现在软件包将安装到您的用户目录中,并且不会损害任何权限。


编辑:如果您无法安装 yeoman,请在名为 yodoctor 的 PATH 目录之一中创建一个 bash 文件,其中包含以下内容

#!/bin/bash
yo doctor

使文件可执行

chmod +x yodoctor

现在你应该可以安装 yeoman 了。

【讨论】:

查看 npm 修复 npm 权限问题的推荐选项:https://docs.npmjs.com/getting-started/fixing-npm-permissions。这个答案(来自@febLey)与 NPM 的建议一致。【参考方案3】:

你也可以这样做:

sudo chown -R $USER /usr/local

并递归地将文件更改为您的当前用户。

【讨论】:

-1 回答,见LFH:/usr 是可共享的只读数据。这意味着 /usr 应该可以在各种符合 FHS 的主机之间共享,并且不能被写入。任何特定于主机或随时间变化的信息都存储在其他地方。大型软件包不得使用 /usr 层次结构下的直接子目录。【参考方案4】:

我发现这是一个更好的解决方案

sudo chown -R $USER /Users/$USER

这只会将您用户的所有者更改为您,并且 npm 应该安装在 OS X 上您的用户下。 我一直在阅读的所有内容都说 sudo 用于 npm 安装是不好的,当您向恶意脚本敞开心扉时,我必须同意他们的观点。

【讨论】:

【参考方案5】:

我不推荐这里提供的两种解决方案,因为它们是蛮力解决方案。相反,我建议阅读One does not simply sudo npm

【讨论】:

以上是关于npm 命令 - sudo 与否?的主要内容,如果未能解决你的问题,请参考以下文章

sudo: npm:找不到命令

sudo:npm:找不到命令

Ec2 sudo 运行 npm或node时,出现找不到命令

sudo npm 找不到命令

詹金斯:没有sudo的npm安装失败

命令'/ bin / sh -c npm install'返回非零代码:1