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

我刚刚通过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.0npm ERR! command "node" "/usr/local/bin/npm" "search" "bower"npm ERR! cwd /Users/chietalanpm ERR! node -v v0.10.4npm ERR! npm -v 1.2.18npm ERR! path /Users/chietala/.npm/-/all/.cache.jsonnpm ERR! code EACCESnpm ERR! errno 3npm 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.lognpm ERR! not ok code 0
619951 次浏览

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

sudo chown -R $(whoami) ~/.npm
sudo chown -R `whoami` /usr/local/lib

您还需要node_modules目录中的写入权限:

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

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

安装凹槽时:

-npm install recess -g
  1. 您需要解锁home目录中的权限,例如Noah说:

    sudo chown -R `whoami` ~/.npm
  2. You also need write permissions to the node_modules directory, like Xilosays, so if it still isn't working, try:

    sudo chown -R `whoami` /usr/local/lib/node_modules
  3. If you are still seeing errors, you may also need to correct /usr/local permissions:

    sudo chown -R `whoami` /usr/local

Please note that as indicated in this post /usr/local/ isn't actually a system dir if you are on a Mac, so, this answer is actually perfectly "safe" for Mac users. However, if you are on Linux, see Christopher Will's answer below for a multi-user friendly, system dir safe (but more complex) solution.

我在如果没有sudo,NPM模块将无法全局安装遇到了类似的问题,问题是当我安装节点时,我通过chris/lea ppa repo使用sudo完成了它

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

在我的情况下,从nodejs.org#下载最新的稳定节点源node-v0.10.20.tar.gz

tar-zxfnode-v0.10.20.tar.gz#解压缩源

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

sudo chown$USER-R /usr/local

./配置--pre重塑=/usr/Local&&make&&make install

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

mkdir~/opt

./配置--pre重塑=~/选择&&制作&&制作安装

回显'导出PATH=~/op/bin:${PATH}'>>~/. bashrc#或~/.配置文件或~/.bash_profile或~/. zshenv,具体取决于当前的操作系统

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

npm install-gmodule_to_install

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

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

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

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

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

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

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

在那之后,npm工作得很好!

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

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

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

# Create new groupsudo 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-loginnewgrp nodegrp
# Check group - nodegrp should be listed as well nowgroups
# Change group of node_modules, node, npm to new groupsudo chgrp -R nodegrp /usr/lib/node_modules/sudo chgrp nodegrp /usr/bin/nodesudo 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

一些模块(gruntboweryo等)仍然需要安装为root。这是因为它们在 /user/bin/.中创建符号链接

编辑

3年后,我建议使用节点版本管理器。它可以节省你很多时间和麻烦。

对于我来说,是因为~/tmp的允许。

sudo chown -R $USER ~/tmp

而且没事!

更改“系统全局”文件夹的所有者是一种黑客行为。在新安装时,我会为“用户全局”程序配置NPM以使用已经可写的位置

npm config set prefix "${HOME}/npm"

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

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

@ErikAndreas的回答如果没有#0,NPM模块将无法全局安装,和更长的分步指南@sindreshus也设置$MANPATH

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

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


解决方案1:NVM

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

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

NVM(Node Version Manager)允许您在没有root权限的情况下安装Node.js,还允许您安装许多版本的Node以轻松使用它们。

  1. 卸载Node(可能需要root权限)。这个可能会对您有所帮助。
  2. 然后按照说明在本页安装NVM
  3. 通过NVM安装Node:nvm install node

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

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


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

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

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

查看这篇伟大的文章,了解有关在没有sudo的情况下全局安装npm模块的分步说明。

另请参阅:npm在修复npm权限上的留档。

适用于Mac(摘自Christoper Will的回答)

Mac OS X 10.9.4

  1. 系统首选项>用户和组>(解锁)>按+:

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

    创建组后,勾选要包含在此组中的用户

  2. <区块链>

    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目录的所有者,以便可以在其中发出正常命令。

sudo chown -R $USER /usr/local

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

以上所有都不是必需的。

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

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

这是一个很好的视频解释

对我来说,只执行

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

不行,那我也执行

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

一切工作正常!

好像我们需要更多的答案,但无论如何。

Sindre Sorus有一个指南在OS X和Linux上全局安装npm包,无需sudo概述了如何干净地安装而不会弄乱权限:

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

  1. 为您的全局包创建一个目录

    mkdir "${HOME}/.npm-packages"
  2. Reference this directory for future usage in your .bashrc/.zshrc:

    NPM_PACKAGES="${HOME}/.npm-packages"
  3. Indicate to npm where to store your globally installed package. In your $HOME/.npmrc file add:

    prefix=${HOME}/.npm-packages
  4. Ensure node will find them. Add the following to your .bashrc/.zshrc:

    NODE_PATH="$NPM_PACKAGES/lib/node_modules:$NODE_PATH"
  5. Ensure you'll find installed binaries and man pages. Add the following to your .bashrc/.zshrc:

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

Check out npm-g_nosudo for doing the above steps automagically

Checkout the source of this guide for the latest updates.

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

希望有帮助。

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

约翰·帕帕指出了这个问题背后的历史和推理,并给出了一个坚实的解决方案

约翰·帕帕的步骤是:

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

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

这是我使用和工作的解决方案。我尝试使用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

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

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

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

  1. 找到npm目录的路径:

    npm config get prefix

For many systems, this will be /usr/local.

WARNING: If the displayed path is just /usr, switch to Option 2.

  1. Change the owner of npm's directories to the name of the current user (your username!):

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

    这将更改npm和其他一些工具(lib/node_modulesbin分享)使用的子文件夹的权限。

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

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

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

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

    mkdir ~/.npm-global
  2. Configure npm to use the new directory path:

    npm config set prefix '~/.npm-global'
  3. Open or create a ~/.profile file and add this line:

    export PATH=~/.npm-global/bin:$PATH
  4. Back on the command line, update your system variables:

    source ~/.profile

正确配置NPM的另一个很好的修复,运行以下命令:

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

@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

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

为此,请在系统中选择或创建一个新文件夹。您可能希望将其放在主目录中,或者像我一样,在/usr/local下以保持一致性,因为我也是Mac用户(我不希望根据我碰巧在前面的机器查看不同的位置)。另一个很好的理由是/usr/local文件夹可能已经在您的PATH中(除非您想摆弄您的PATH),但您新创建的文件夹很可能不是,您需要自己将其添加到PATH中的. bash配置文件. bashrc文件。

长话短说,我用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}

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

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

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

太长别读

运行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/.npmroot拥有的文件。

只要在运行npm install时始终使用sudo -isudo -H来安装全局软件包,您的npm权限问题就会消失。

为了好。

--q. v.修复已经混乱的npm的公认答案。

最好的解决方案是这个,它由npm留档提供。


对于Ubuntu建议的解决方案是选项#2

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

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

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

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

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

NPM_CONFIG_PREFIX=~/.npm-global


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

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

brew install node

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

解决方案:允许使用npm。

打开一个终端:

命令+空格键,然后键入终端

输入此命令:

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

这个解决方案允许权限只需要目录,保持其他目录的好和安全。

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

由于安全风险,chown或chmod是不是解决方案。

相反,这样做:

首先检查,npm指向哪里,如果你调用:

npm config get prefix

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

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

这将在您的Home Directory中创建一个npm-Directory并将npm指向它。

要使此更改永久化,您必须将export-命令添加到您的. bashrc:

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

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

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

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


解决方案/强烈推荐:更改npm的默认目录(来自官方文档

在前进之前备份您的计算机。

(可选)如果您安装错误,请先卸载它:

npm uninstall <package-name>  # use sudo if you used it while installationnpm cache verify  # or, npm cache clean for npm version below 5.x.x
  1. 为全局安装创建一个目录:

    #0

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

    #0

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

    #0

  4. 回到命令行,更新系统变量,或重新启动终端:

    #0

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

    #0

如果sudo chown -R $(whoami) ~/.npm不适合您,或者您需要一个非终端命令解决方案。

问题是您的用户帐户没有node_modules文件夹的写入权限,因此您可以执行以下操作

  1. 打开finder并按cmd+shift+g这将打开转到带有url的文件夹

  2. 写入以下路径/usr/local/lib/node_modules并按go

  3. 右键单击node_modules文件夹并选择Get Info

  4. 向下滚动到sharing & permissions部分

  5. 解锁才能进行更改。

  6. +并添加您的用户帐户

  7. 确保您在特权下拉列表中选择Read & Write

现在您应该能够在没有sudo的情况下安装软件包,并且应该解决权限问题

你可以试试这个,适用于ubuntu和mac

sudo chown -R $(whoami) /usr/local/lib/node_modules

我通过将所有者从root更改为我的用户名来解决它

sudo chown -R me:me /home/me/.config/configstore/

用您的用户名和组更改我。

我喜欢使用ubuntu组来实现这一点,而不是更改所有者。这很简单。

  1. 首先使用apt-get安装nodejs和npm

    sudo apt-get update && sudo apt-get install nodejs npm

  2. 找出谁登录了,即用户名,运行以下命令在终端中查看

    whoami

  3. 您可以使用一个非常简单的命令查看分配给您的组列表,通常第一组是您的用户名本身

    groups

  4. 运行以下命令以允许登录用户访问

    sudo chmod 777 -R /usr/local && sudo chgrp $(whoami) -R /usr/local

  5. 更新npm和nodejs

    npm install -g npm

 sudo npm install --unsafe-perm=true --allow-root

npm config set prefix ~/.npmexport PATH="$PATH:$HOME/.npm/bin"

它将确保您的所有全局安装都将使用此前缀。您的用户拥有此目录很重要。

没有人提到这一点,但实际上没有必要搞乱权限或单独的npm安装,只需为命令指定一个不同的缓存文件夹即可解决问题

npm install --cache .npmnpm run build --cache .npm

这将创建一个本地.npm文件夹

我在评论中尝试了一切,没有任何成功,但以下命令对我来说很神奇:

hash -r

只需尝试

npm rebuild

然后完成后运行您通常的命令

当尝试以root身份全局安装包时,该过程将失败,EUIDLOOKUPEACCESnpm将弄乱您的用户全局包权限。

为了理解这个问题,我建议阅读这个问题。简而言之,npm尝试使用当前进程的EUID来运行安装脚本,而不是作为root,而是作为运行npm的原始用户,同时假设以root身份运行的用户将使用sudo,因此EUID将被设置。

这就是为什么基于使用sudo@陈志立的答案应该有效。

但在容器构建中安装包时并非如此。在容器sudo中经常会丢失。构建通常只会以root身份运行。

当然,可以更改容器构建以作为普通用户运行这些命令并以该用户身份构建所有内容。这不会使构建更安全,并且在某些情况下可能是不可取的。

因此,在容器构建中,以下是如何使npm全局安装工作,例如使用yarn包。

# setpriv --ruid 0 --euid 0 npm --unsafe-perm install -g yarn

setpriv是一个小型低级实用程序,应该可以在任何linux发行版上使用或轻松安装。