如何在没有 sudo 的情况下修复 npm 抛出错误

Posted

技术标签:

【中文标题】如何在没有 sudo 的情况下修复 npm 抛出错误【英文标题】:How to fix npm throwing error without sudo 【发布时间】:2013-04-15 14:03:20 【问题描述】:

我刚刚通过 nodejs.org 上的包安装了 node 和 npm,每当我尝试使用 npm 搜索或安装某些东西时,它都会抛出以下错误,除非我 sudo 命令。我感觉这是权限问题?我已经是管理员了。

npm ERR! Error: EACCES, open '/Users/chietala/.npm/-/all/.cache.json'
npm ERR!   [Error: EACCES, open '/Users/chietala/.npm/-/all/.cache.json']
npm ERR!   errno: 3,
npm ERR!   code: 'EACCES',
npm ERR!   path: '/Users/chietala/.npm/-/all/.cache.json' 
npm ERR! 
npm ERR! Please try running this command again as root/Administrator.

npm ERR! System Darwin 12.2.0
npm ERR! command "node" "/usr/local/bin/npm" "search" "bower"
npm ERR! cwd /Users/chietala
npm ERR! node -v v0.10.4
npm ERR! npm -v 1.2.18
npm ERR! path /Users/chietala/.npm/-/all/.cache.json
npm ERR! code EACCES
npm ERR! errno 3
npm ERR! stack Error: EACCES, open '/Users/chietala/.npm/-/all/.cache.json'
npm ERR! 
npm ERR! Additional logging details can be found in:
npm ERR!     /Users/chietala/npm-debug.log
npm ERR! not ok code 0

【问题讨论】:

请考虑使用 NVM 的the solution:***.com/a/24404451/1480391(而不是使用权限进行黑客攻击) @janaspage 你不能通过NPM(节点包管理器)安装节点或NVM(节点版本管理器),这是没有意义的。 NPM 位于节点内部(同时安装)。看看***页面:en.wikipedia.org/wiki/Npm_(software) 终于有一个比sudo chown更好的解决方案了:github.com/sindresorhus/guides/blob/master/… 在 OSX 下并使用 0official pkg intaller 安装节点,此解决方案不起作用。我改用这个:***.com/a/34968008/675565 它解释了问题和修复:docs.npmjs.com/getting-started/fixing-npm-permissions 【参考方案1】:

这看起来像是您的主目录中的权限问题。要收回 .npm 目录的所有权,请执行:

sudo chown -R $(whoami) ~/.npm

【讨论】:

我认为whoami 是一个占位符,但它按字面意思输入,所以它一定是我不理解的变量。 whoami 是一个实际的 shell 命令en.wikipedia.org/wiki/Whoami。 whoami 周围的反引号确保它被正确执行,然后放入 chown 命令中【参考方案2】:
sudo chown -R `whoami` /usr/local/lib

【讨论】:

【参考方案3】:

你还需要node_modules目录的写权限:

sudo chown -R $USER /usr/local/lib/node_modules

【讨论】:

我不知道为什么这仍然会得到支持。将系统目录的所有权更改为特定用户是一种非常糟糕的做法!请参阅下面的答案以了解其他解决方案(例如为节点用户创建单独的组)。 无论你做什么 -- 绝对不要在 /usr/local/lib 或 /usr/lib/ 上运行 'sudo chmod -R whoami' 你会毁掉你的 sudoers 文件,你会讨厌自己。 【参考方案4】:

我在安装 Recess (https://github.com/twitter/recess) 为 Bootstrap 3 编译我的 CSS 时遇到了这个问题。

安装凹槽时:

-npm install recess -g

    您需要在home 目录中解锁权限,例如Noah 说:

    sudo chown -R `whoami` ~/.npm
    

    您还需要对node_modules 目录的写入权限,例如Xilo 说,所以如果它仍然不起作用,请尝试:

    sudo chown -R `whoami` /usr/local/lib/node_modules
    

    如果您仍然看到错误,您可能还需要correct /usr/local permissions:

    sudo chown -R `whoami` /usr/local
    

请注意,如果您使用的是 Mac,in this post /usr/local/ 实际上并不是系统目录,因此,对于 Mac 用户来说,这个答案实际上是完全“安全”的。但是,如果您使用的是 Linux,请参阅下面的 Christopher Will 的答案,了解多用户友好、系统目录安全(但更复杂)的解决方案。

【讨论】:

这是个坏主意。您可能不希望系统目录归特定用户所有。除了严重的安全问题外,这也不兼容多用户。【参考方案5】:

我在NPM modules won't install globally without sudo 遇到了类似的问题,问题是当我安装节点时,我通过 chris/lea ppa repo 使用 sudo 完成了它

我的解决方案是卸载节点,然后以这种方式安装:

从 nodejs.org 下载最新的稳定节点源 #in my case node-v0.10.20.tar.gz

tar -zxf node-v0.10.20.tar.gz #解压缩源

cd node-v0.10.20 #进入解压文件夹

sudo chown $USER -R /usr/local

./configure --prefix=/usr/local && make && make install

PD:如果您不想更改 /usr/local 文件夹的所有权,可以将其安装在您已经拥有的位置。这种方法的问题是你必须将安装文件夹与 bash 命令行绑定,以便我们以后可以使用 node 命令

mkdir ~/opt

./configure --prefix=~/opt && make && make install

echo 'export PATH=~/opt/bin:$PATH' >> ~/.bashrc #or ~/.profile or ~/.bash_profile or ~/.zshenv 取决于当前的操作系统

使用其中任何一种方法,您都可以在不使用 sudo 的情况下执行以下操作

npm install -g module_to_install

【讨论】:

我最终使用了这种方法。在构建之前使用了sudo chown $USER /use/local。到目前为止看起来不错,是时候尝试构建 atom 了!谢谢!【参考方案6】:

当您运行 npm install -g somepackage 时,您可能会收到 EACCES 错误,要求您以 root/管理员身份再次运行该命令。这是权限问题。

很容易修复,打开您的终端(应用程序 > 实用程序 > 终端)

sudo chown -R $USER /usr/local/lib/node_modules

** 我强烈建议你不要使用 sudo 进行包管理(sudo npm -g install something),因为以后可能会遇到一些问题**

参考:http://foohack.com/2010/08/intro-to-npm/

【讨论】:

耶!这个对我做了!在完成上述其他其他操作之后:sudo chown -R `whoami` ~/.npmsudo chown -R `whoami` /usr/local/lib 这可能会导致许多其他应用程序出现权限问题,所以我建议不要这样做。为什么要用一罐蠕虫换另一罐? 或者至少将其细化为 /usr/local/lib/node_modules。 这个,这个,还有更多。在把我的头撞到墙上之后,这成功了。 +1 这是我的问题。在新的 macbook (os x 10.10.3) 上,/usr/local/lib/node_modules 的权限为: $ ll /usr/local/lib/node_modules total 0 drwxr-xr-x 3 24561 wheel 102B Mar 31 18:19 . drwxrwxr-x 4 24561 管理员 136B 3 月 31 日 18:19 .. drwxr-xr-x 26 65534 员工 884B 4 月 13 日 10:53 npm【参考方案7】:

在 Mac OS X 上,使用Homebrew'sbrew install npm 安装时,安装路径为/usr/local/share/npm/,同时包含bin/lib/node_modules/ 子文件夹。

运行此命令将所有者更改为您当前登录的用户应该可以解决所有问题,并允许您在没有sudo 的情况下安装全局 NPM 包。

sudo chown -R $USER ~/.npm /usr/local/share/npm/

osxhomebrew

【讨论】:

现在会推荐使用npm config 的my other answer to this question。【参考方案8】:

其实我也遇到了同样的问题。我正在运行 Ubuntu。我的问题出现是因为我丢失了 Ubuntu 的公钥。甚至没有更新我的系统。它给出了 GPG 错误。在这种情况下,您可以使用以下命令重新获得您的密钥:

sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys <key in GPG error>

之后 npm 工作正常!

【讨论】:

【参考方案9】:

其他答案建议将系统目录的所有权或权限更改为特定用户。我强烈反对这样做,这可能会变得非常尴尬,并且可能会弄乱整个系统!

这是一种更通用、更安全的方法,也支持多用户。

为 node-users 创建一个新组并将所需的用户添加到该组。然后将依赖于节点的文件/目录的所有权设置为该组。

# Create new group
sudo groupadd nodegrp 

# Add user to group (logname is a variable and gets replaced by the currently logged in user)
sudo usermod -a -G nodegrp `logname`

# Instant access to group without re-login
newgrp nodegrp

# Check group - nodegrp should be listed as well now
groups

# Change group of node_modules, node, npm to new group 
sudo chgrp -R nodegrp /usr/lib/node_modules/
sudo chgrp nodegrp /usr/bin/node
sudo chgrp nodegrp /usr/bin/npm

# (You may want to change a couple of more files (like grunt etc) in your /usr/bin/ directory.)

现在您可以轻松地以用户身份安装模块

npm install -g generator-angular

某些模块(grunt、bower、yo 等)仍需要以 root 身份安装。这是因为他们在 /user/bin/ 中创建符号链接。

编辑

3 年后,我建议使用 Node Version Manager。它可以为您节省大量时间和麻烦。

【讨论】:

如果 node 是通过源安装的,虽然多用户会是个问题,但所有模块都可以在不使用 sudo 的情况下完美运行。这也很重要,因为在 yeoman 模块的情况下,人们无法通过 sudo yeoman 应用程序更新生成器,因为它不允许执行 sudo :( 在 Linux 上,我通常使用内置的 staff 组来授予对我的开发文件夹的权限。此外,最好运行 chmod g+ws node_modules 以确保您的组具有读/写权限。【参考方案10】:

在我的情况下,这是因为〜/ tmp的许可。所以我这样做了:

sudo chown -R $USER ~/tmp

没关系!

【讨论】:

【参考方案11】:

更改“系统全局”文件夹的所有者是一种黑客行为。在全新安装时,我将 configure NPM to use an already writable location 用于“用户全局”程序:

npm config set prefix ~/npm

然后确保将该文件夹添加到路径中:

export PATH="$PATH:$HOME/npm/bin"

参见@ErikAndreas'answer 到NPM modules won't install globally without sudo 和longer step-by-step guide by @sindresorhus,还设置了$MANPATH

【讨论】:

【参考方案12】:

在执行诸如写入 npm 目录npm linknpm install -g 等)之类的操作时,需要您在安装 Node 时使用的权限。

您可能以 root 权限运行 Node.js 安装,这就是全局包安装要求您成为 root 的原因。


解决方案 1:NVM

不要破解权限,以正确的方式安装 Node.js。

在开发机器上,您不应该使用 root 权限安装和运行 Node.js,否则像 npm linknpm install -g 这样的东西将需要相同的权限。

NVM(Node 版本管理器)允许您在没有 root 权限的情况下安装 Node.js,还允许您安装多个版本的 Node 以轻松使用它们。非常适合开发。

    卸载节点(可能需要 root 权限)。 This 可能会对您有所帮助。 然后按照说明on this page 安装NVM。 通过 NVM 安装节点:nvm install node

现在npm linknpm install -g 将不再要求您是 root。

编辑:另见https://docs.npmjs.com/getting-started/fixing-npm-permissions


解决方案 2:为给定用户全局安装软件包

不要破解权限,以正确的方式全局安装 npm 包。

如果您使用的是 OSX 或 Linux,则可以为您的全局包创建一个用户专用目录并设置 npmnode 以了解如何查找全局安装的包。

查看this great article,了解有关在不使用 sudo 的情况下全局安装 npm 模块的分步说明。

另请参阅:npm 在Fixing npm permissions 上的文档。

【讨论】:

在所有发布的解决方案中,这里的 NVM 解决方案为我提供了最好的结果。强烈建议使用 NVM 而不是玩弄权限。 这些解决方案都不适合我。 我从快照商店安装了节点,但我无法运行 npm install -g 之类的命令。但是在尝试了 NVM 解决方案之后,一切都很顺利。非常感谢您的回答。【参考方案13】:

对于 Mac(取自 Christoper Will 的回答)

Mac OS X 10.9.4

    系统偏好>用户和组>(解锁)>按+:

    新帐户 > “群组” 账户名:nodegrp

    创建群组后,勾选要加入该群组的用户

    sudo chgrp -R nodegrp /usr/local/lib/node_modules/ sudo chgrp nodegrp /usr/bin/node sudo chgrp nodegrp /usr/bin/npm sudo chown -R $(whoami):nodegrp ~/.npm

【讨论】:

我不得不更改几个路径到 /usr/local/bin 但除此之外,这个解决方案在我的 OX X 10.9 机器上运行良好 - 谢谢! 更改系统目录所有权的坏习惯。 @richremer 我认为这取决于您要达到的目标。如果该文件夹最初只能由 sudoer 访问,则只能以这种方式进行更改。我们将更改限制为与 npm 相关的文件夹。保留sudo 或更改那些文件夹组所有权以便普通用户可以修改它会更安全吗?如果普通用户不应该对此文件夹执行任何操作,那么当然不应该更改文件夹的组所有权。 适当的做法是使用 sudo 安装全局包,但使用 -H 标志。具体来说,sudo -H npm install -g &lt;pkg&gt;。这可确保正确描述系统和用户文件夹的权限。您不想做的是使用sudo npm install -g,因为这会将根拥有的文件安装到您的用户目录中。如果 npm 足够聪明以正确的方式执行此操作,那就太好了,但事实并非如此,因此您必须使用 -H sudo 标志才能在全局范围内正确安装。【参考方案14】:

我将我的用户帐户设置为 /usr/local 目录的所有者,这样就可以在那里发出正常的命令。

sudo chown -R $USER /usr/local

参考:http://howtonode.org/introduction-to-npm

【讨论】:

将系统目录的所有权设置为您的个人用户帐户的错误做法。【参考方案15】:

以上都不是必须的。

我遇到的问题是我在运行 NPM 时使用了 -g。我无法弄清楚我为什么没有在我的项目中创建一个“npm_module”文件夹。

解决方案是运行 'NPM init' 这将创建一个 'package.json' 和 'npm_module' 文件夹,所有后续模块都将加载到该文件夹​​中。运行 npm 时不要使用 -g 使用 -s 来更新您的“package.json”文件。

Here is a good video explaining

【讨论】:

该视频需要付费订阅。你能总结一下,或者指出一个免费资源吗?我假设您的意思是“npm”,而不是“NPM”。 此答案与 OP 的问题无关,并且包含指向仅限订阅服务的链接。如果您找到了一个 *** 问题找不到的问题的解决方案,这是创建您自己的问题和答案的好机会。【参考方案16】:

对我来说,只执行

sudo chown -R $(whoami) ~/.npm

不起作用。然后,我也执行了

sudo chown -R $(whoami) /usr/lib/node_modules/
sudo chown -R $(whoami) /usr/bin/node
sudo chown -R $(whoami) /usr/bin/npm

一切正常!

【讨论】:

你太棒了,先生 :) /usr/lib 中的文件是系统文件,不应归您的个人用户帐户所有。【参考方案17】:

好像我们在这里需要更多答案,但无论如何..

Sindre Sorus 有一个指南 Install npm packages globally without sudo on OS X and Linux 概述了如何干净地安装而不会弄乱权限:

这是一种为给定用户全局安装软件包的方法。

    为你的全局包创建一个目录

    mkdir "$HOME/.npm-packages"
    

    参考此目录以备将来在您的 .bashrc/.zshrc 中使用:

    NPM_PACKAGES="$HOME/.npm-packages"
    

    向 npm 指示存储全局安装包的位置。在您的$HOME/.npmrc 文件中添加:

    prefix=$HOME/.npm-packages
    

    确保节点会找到它们。将以下内容添加到您的 .bashrc/.zshrc:

    NODE_PATH="$NPM_PACKAGES/lib/node_modules:$NODE_PATH"
    

    确保您可以找到已安装的二进制文件和手册页。将以下内容添加到您的.bashrc/.zshrc

    PATH="$NPM_PACKAGES/bin:$PATH"
    # Unset manpath so we can inherit from /etc/manpath via the `manpath`
    # command
    unset MANPATH # delete if you already modified MANPATH elsewhere in your config
    MANPATH="$NPM_PACKAGES/share/man:$(manpath)"
    

查看npm-g_nosudo 自动执行上述步骤

查看source of this guide 以获取最新更新。

【讨论】:

tx 用于编辑@AndyHayden :) 上面的 cmets 中建议了我的首选方法:使用 NVM! ***.com/a/24404451/1480391 唯一对我有用且不涉及权限的解决方案。我讨厌 NPM 及其愚蠢的权限愚蠢。感谢您的解决方案!【参考方案18】:

我发现如果你只是sudo -s“它只是启动一个具有root权限的shell作为一个步骤”,它真的对我有用。我不知道这是否是一个好习惯。

希望对你有帮助。

参考:https://apple.stackexchange.com/posts/14423/revisions

【讨论】:

【参考方案19】:

John Papa 指出了这个问题背后的历史和推理,并给出了a solid fix:

约翰爸爸的步骤是:

    使用 brew 安装没有 npm 的节点 更新你的 .bash_profile/.bashrc 让 npm 和 node 知道在哪里安装和查找包 使用 brew 更新节点,使用 npm 更新自身

希望这对好奇的人有所帮助!

【讨论】:

【参考方案20】:

这是我使用和工作的解决方案。我尝试使用 whoami 从未成功。

sudo chown -R $USER /usr/local/lib/node_modules

然后

sudo chown -R $USER /usr/local/bin/npm

然后

sudo chown -R $USER /usr/local/bin/node

【讨论】:

【参考方案21】:

关于如何修复 npm install 权限与 EACCES 错误的官方文档位于 https://docs.npmjs.com/getting-started/fixing-npm-permissions。

我在 OSX 上使用 .pkg 安装程序全新安装节点后遇到了这个问题。这里有一些很好的答案,但我还没有看到 npmjs.com 的链接。

选项1:更改npm默认目录的权限

    找到 npm 目录的路径:

    npm config get prefix
    

对于许多系统,这将是 /usr/local

警告:如果显示的路径只是/usr,请切换到选项2

    将 npm 目录的所有者更改为当前用户的名称(您的用户名!):

    sudo chown -R $(whoami) $(npm config get prefix)/lib/node_modules,bin,share
    

    这会更改 npm 和其他一些工具(lib/node_modulesbinshare)使用的子文件夹的权限.

选项 2:将 npm 的默认目录更改为另一个目录

有时您不想更改 npm 使用的默认目录(即 /usr)的所有权,因为这可能会导致一些问题,例如,如果您与其他人共享系统用户。

相反,您可以将 npm 配置为完全使用不同的目录。在我们的例子中,这将是我们主文件夹中的一个隐藏目录。

    为全局安装创建一个目录:

    mkdir ~/.npm-global
    

    配置 npm 以使用新的目录路径:

    npm config set prefix '~/.npm-global'
    

    打开或创建一个 ~/.profile 文件并添加以下行:

    export PATH=~/.npm-global/bin:$PATH
    

    回到命令行,更新你的系统变量:

    source ~/.profile
    

【讨论】:

谢谢,这个对我有用,因为 chown soludion 没有。你救了我。 我喜欢这个答案的选项 2。(1)它没有使用 sudo 的安全漏洞,(2)它为其他用户保留架构,(3)它引用文档,并且( 4) 它包含所需的命令行条目。感谢您的添加! 那么当您安装符号链接到/usr/bin/ 的东西时会发生什么?现在只有您的用户可以访问它。您以其他人身份登录,仍然无法访问,因为文件实际上位于另一个用户的主目录中!【参考方案22】:

另一个很好的解决方法是正确配置 NPM,运行以下命令:

npm config set prefix '~/.npm_packages'
PATH=$PATH:$HOME/.npm_packages/bin; export PATH

【讨论】:

【参考方案23】:

@Yves M. 的回答与我的解决方案非常相似。这是我使用的命令,与他的略有不同。

curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.31.0/install.sh | bash

然后查询最新版本:

nvm ls-remote

然后安装最新版本:

nvm install YOUR_VERSION_HERE

例子

nvm install v5.8.0

【讨论】:

【参考方案24】:

在我看来最好的选择是npm documentation 中建议的选项,即首先通过运行npm config get prefix 检查全局node_modules 的默认安装位置。如果你得到了,就像我在 Trusty 上所做的那样,/usr,你可能想要将它更改为一个你可以安全拥有的文件夹,而不会像我一样搞砸。

为此,请在您的系统中选择或创建一个新文件夹。您可能希望将它放在您的主目录中,或者像我一样,在/usr/local 下以保持一致性,因为我也是 Mac 用户(我不希望根据我碰巧在前面的机器查看不同的地方的)。这样做的另一个充分理由是 /usr/local 文件夹可能已经在您的 PATH 中(除非您喜欢弄乱您的 PATH),但您新创建的文件夹很可能不是,您需要添加把它放到你的 .bash-profile.bashrc 文件中的 PATH 中。

长话短说,我用npm config set prefix '/usr/local'更改了全局模块的默认位置,创建了文件夹/usr/local/lib/node_modules(它将被npm使用)并使用以下命令更改npm使用的文件夹的权限:

sudo chown -R $(whoami) $(npm config get prefix)/lib/node_modules,bin,share

现在您可以安全地全局安装任何模块。希望这会有所帮助!

【讨论】:

【参考方案25】:

这就是我在 Windows 8.1 上解决问题的方法:

转到您的 nodejs 安装(通常是 C:\Program Files\nodejs) 右键单击 node_modules 文件夹并转到属性 点击安全标签和高级 在顶部您会看到“所有者:SYSTEM”,点击更改 输入您要授予权限的用户,然后单击确定 选中高级设置底部的“将所有子对象权限条目替换为此对象的可继承权限条目”复选框,然后单击确定 做任何你需要的 npm 安装/更新

【讨论】:

【参考方案26】:

TL;DR

在运行npm install 安装全局包时,始终使用sudo -isudo -H


当您使用npm 时,它会将包下载到您的用户主目录。当您以 sudo 运行时,npm 会将文件安装到同一目录,但现在它们归 root 所有。

所以这绝对是每个曾经使用过npm的人都会发生的事情:

使用npm install foo 安装一些本地包没有问题 使用sudo install -g foo-cli 安装全局包没有问题 尝试使用npm install bar 安装本地包 对 npm 设计师感到沮丧,因为您必须再次访问 chmod 目录

当您在 sudo 中使用 -i-H 选项时,您的主目录将是 root 的主目录。任何全局安装都会将包缓存到/root/.npm,而不是/home/me/.npm 上的root 拥有的文件。

在运行npm install 时始终使用sudo -isudo -H 安装全局包,您的npm 权限问题就会迎刃而解。

为了好。

-- q.v. 修复一个已经搞砸的npm 的公认答案。

【讨论】:

最佳和简单的修复 仅供参考,最后一个链接现在似乎已损坏。【参考方案27】:

最佳解决方案是 this,由 npm 文档提供。


对于 Ubuntu,建议的解决方案是 Option#2

简要步骤: 为全局安装创建一个目录:mkdir ~/.npm-global

配置 npm 以使用新的目录路径:npm config set prefix '~/.npm-global'npm config get prefix 可以帮助您验证前缀是否已更新。结果将是 /.npm-global

打开或创建一个 ~/.profile 文件并添加以下行:export PATH=~/.npm-global/bin:$PATH

返回命令行,更新您的系统变量:source ~/.profile

除了步骤 2-4,您还可以使用相应的 ENV 变量 (例如,如果您不想修改 ~/.profile):

NPM_CONFIG_PREFIX=~/.npm-global


对于 Mac,建议的解决方案是 Option#3

在 Mac OS 上,您可以使用 Homebrew 包管理器完全避免这个问题

brew install node

【讨论】:

这个 NPM_CONFIG_PREFIX 不起作用。这是 npm 描述中的错误。看我上面的帖子,正确的做法是:***.com/a/41395398/1256697【参考方案28】:

问题: 您无权写入 npm 用于存储全局包和命令的目录。

解决方案: 允许 npm 的权限。

打开一个终端:

command + 空格键然后输入“终端”

输入这个命令:

sudo chown -R $(whoami) $(npm config get prefix)/lib/node_modules,bin,share
注意:这需要您的密码。

此解决方案仅允许对所需目录授予权限,从而使其他目录保持良好和安全。

【讨论】:

拒绝投票,因为设置系统文件夹的用户所有权是一种反模式,这并不能说明这一点。在npm config get prefix 在主文件夹中返回某些内容的特殊情况下,此解决方案将修复权限,但不会解决以安全方式为共享环境安装全局包的潜在问题。 这将重写操作系统很大一部分的权限。例如,在 Ubuntu 中运行它会导致“sudo”命令本身变得不可用。 更改sudo 权限是个大问题!!【参考方案29】:

当心!!! 当心!!! 当心!!!

chown 或 chmod 不是解决方案,因为存在安全风险。

改为这样做:

首先检查 npm 指向的位置,如果你调用:

npm config get prefix

如果返回 /usr,你可以执行以下操作:

mkdir ~/.npm-global
export NPM_CONFIG_PREFIX=~/.npm-global
export PATH=$PATH:~/.npm-global/bin

这会在您的主目录中创建一个 npm-Directory 并将 npm 指向它。

要使此更改永久生效,您必须将 export-command 添加到您的 .bashrc:

echo -e "export NPM_CONFIG_PREFIX=~/.npm-global\nexport PATH=\$PATH:~/.npm-global/bin" >> ~/.bashrc

【讨论】:

【参考方案30】:

问题:您(用户)没有正确的目录权限集。

即时解决办法是使用 sudo 运行 npm install,但这可能会给您同样的错误,或者安装不正确。

并且更改目录所有权不是一个好的选择,一个临时补丁。


解决方案/建议:更改npm的默认目录(来自官方docs)

在继续之前备份您的计算机。

(可选)如果安装有误,请先卸载:

npm uninstall <package-name>  # use sudo if you used it while installation
npm cache verify  # or, npm cache clean for npm version below 5.x.x 

    为全局安装创建一个目录:

    mkdir ~/.npm-global

    配置 npm 使用新的目录路径:

    npm config set prefix '~/.npm-global'

    打开或创建~/.profile~/.bash_profile 文件并添加以下行:

    export PATH=~/.npm-global/bin:$PATH

    回到命令行,更新你的系统变量,或者重启终端:

    source ~/.profile

    (可选)测试:在不使用 sudo 的情况下全局下载包。

    npm install -g jshint

【讨论】:

以上是关于如何在没有 sudo 的情况下修复 npm 抛出错误的主要内容,如果未能解决你的问题,请参考以下文章

npm / yeoman 在没有 sudo 的情况下安装 generator-angular

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

如何在没有 sudo 的情况下为 Python 安装包时避免权限被拒绝

使用 npm 链接时如何修复“任务不在您的 gulpfile 中”错误?

如何在没有“dist”的情况下在 NPM 上发布 TypeScript 模块?

sudo: npm:找不到命令