关于node.js:npm在没有sudo的情况下抛出错误

npm throws error without sudo

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
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


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

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


在执行诸如在NPM目录(npm linknpm install -g等操作时,需要您在安装节点时使用的权限。

您可能使用根权限运行节点安装,这就是全局包安装要求您是根的原因。

解决方案1:NVM

Don't hack with permissions, install node the right way.

在开发机器上,不应该安装和运行具有根权限的节点,否则像npm linknpm install -g这样的东西将需要相同的权限。

NVM(节点版本管理器)允许您在没有根权限的情况下安装节点,还允许您安装多个版本的节点,以便轻松使用它们。非常适合发展。

  • 卸载节点(可能需要根权限)。这可能对你有帮助。
  • 然后按照本页上的说明安装NVM。
  • 通过NVM安装节点:nvm install node
  • 现在,npm linknpm install -g将不再需要你是根。

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

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

    Don't hack with permissions, install npm packages globally the right way.

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

    请阅读这篇伟大的文章,逐步了解如何在不使用sudo的情况下在全球安装NPM模块。

    另请参阅:NPM关于修复NPM权限的文档。


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

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


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

    安装凹槽时:

    1
    -npm install recess -g
  • 你需要解锁你的home目录中的权限,比如noah说:

    1
    sudo chown -R `whoami` ~/.npm
  • 您还需要对node_modules目录的写权限,比如xilo如果仍然不起作用,请尝试:

    1
    sudo chown -R `whoami` /usr/local/lib/node_modules
  • 如果仍然出现错误,您可能还需要更正/usr/local权限:

    1
    sudo chown -R `whoami` /usr/local
  • 请注意,如本文中所述,如果您在Mac上,那么这个答案实际上不是系统目录,因此对于Mac用户来说,这个答案是完全"安全"的。但是,如果您使用的是Linux,请参阅下面的Christopher Will关于多用户友好、系统目录安全(但更复杂)解决方案的答案。


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

    1
    npm config set prefix ~/npm

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

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

    请参阅@erikandreas'对NPM模块的回答,如果没有sudo,将无法在全球安装。而@sindresorhus的长分步引导也设置了$MANPATH


    其他答案是建议将系统目录的所有权或权限更改为特定用户。我非常不赞成这样做,这可能会变得非常尴尬,并可能破坏整个系统!

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

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

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    # 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.)

    现在您可以作为用户轻松地安装模块

    1
    npm install -g generator-angular

    一些模块(咕噜声、凉亭、溜溜球等)仍需作为根安装。这是因为它们在/user/bin/中创建符号链接。

    编辑

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


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

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

    相反,请执行以下操作:

    首先检查NPM指向的位置,如果您致电:

    1
    npm config get prefix

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

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

    这将在主目录中创建一个NPM目录,并将npm指向它。

    要永久更改,必须将export命令添加到.bashrc:

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


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

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

    选项1:将权限更改为NPM的默认目录

  • 找到NPM目录的路径:

    1
    npm config get prefix
  • 对于许多系统,这将是/usr/local。

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

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

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

    这将更改NPM和其他一些工具(lib/node_模块、bin和share)使用的子文件夹的权限。

  • 选项2:将NPM的默认目录更改为其他目录

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

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

  • 为全局安装创建目录:

    1
    mkdir ~/.npm-global
  • 配置NPM以使用新目录路径:

    1
    npm config set prefix '~/.npm-global'
  • 打开或创建~/.profile文件并添加此行:

    1
    export PATH=~/.npm-global/bin:$PATH
  • 回到命令行,更新系统变量:

    1
    source ~/.profile

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

    Sindre Sorus在OS X和Linux上有一个指南,介绍了如何在不干扰权限的情况下,干净地安装NPM软件包:

    Here is a way to install packages globally for a given user.

  • Create a directory for your global packages

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

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

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

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

    1
    2
    3
    4
    5
    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)"
  • Check out npm-g_nosudo for doing the above steps automagically

    签出此指南的源以获取最新更新。


    DR

    always use sudo -i or sudo -H when running npm install to install global packages.

    ——

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

    因此,这是每一个曾经使用过npm的人所发生的事情:

    • 使用npm install foo无问题地安装一些本地软件包
    • 使用sudo install -g foo-cli安装全局包,无问题
    • 尝试用npm install bar安装本地软件包
    • 现在你必须再次访问chmod目录,你会对npm设计师感到沮丧。

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

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

    永远好。

    http://hood.ie/blog/why-you-shouldnt-use-sudo-with-npm.html

    ——Q.V.修正一个已经操过的npm的公认答案。


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

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

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

    **我强烈建议您不要将包管理与sudo(sudo-npm-g install something)一起使用,因为您稍后可能会遇到一些问题**

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


    对于Mac(由Christoper Will的答案采纳)

    Mac OS X104.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


  • 在我的例子中,这是因为~/tmp的许可,所以我这样做:

    1
    sudo chown -R $USER ~/tmp

    没关系!


    在没有sudo的情况下,我在npm模块上也遇到了类似的问题,问题是当我安装node时,我通过chris/lea ppa repo与sudo一起安装。

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

    在我的例子node-v0.10.20.tar.gz中,从nodejs.org下载最新的稳定节点源

    tar -zxf node-v0.10.20.tar.gz #uncompress sources

    cd node-v0.10.20 #enter uncompressed folder

    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 depending on the current Operative System

    无论采用哪种方法,您都可以在不使用sudo的情况下执行以下操作

    npm install -g module_to_install


    对我来说,只执行

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

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

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

    一切正常!


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

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

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

    解决方案/建议:更改NPM的默认目录(来自正式文档)

    前进前备份计算机。

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

    1
    2
    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 chown -R $(whoami) ~/.npm不适合您,或者您需要非终端命令解决方案。

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

  • 打开finder并按cmd+shift+g,这将打开带有url的go to文件夹。

  • 写下以下路径/usr/local/lib/node_modules并按Go。

  • 右击node_modules文件夹,选择Get Info

  • 向下滚动到sharing & permissions部分

  • 解锁以进行更改。

  • +并添加您的用户帐户

  • 确保在特权下拉框中选择Read & Write

  • 现在您应该可以安装不带sudo的软件包,并且应该解决许可问题。


    这就是我如何解决Windows 8.1上的问题:

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


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

    解决方案:允许NPM使用。

    打开终端:

    command + spacebar then type 'terminal'

    输入此命令:

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

    • 注意:这需要您的密码。

    此解决方案只允许对所需目录的权限,使其他目录保持良好和安全。


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

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

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

    OSX自制软件


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

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

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


    如果在NPM安装期间弹出如下内容,或希望在Mac上全局安装软件包,请使用sudo

    npm ERR! code EACCES
    npm ERR! errno -13
    npm ERR! syscall access


    我通过将所有者从根目录更改为用户名来解决这个问题。

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

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


    约翰·帕帕指出了这个问题背后的历史和原因,并给出了一个可靠的解决方法:

    约翰·帕帕的步骤是:

  • 使用BREW安装不带NPM的节点
  • 更新.bash_profile/.bashrc,让npm和node知道在哪里安装和查找包。
  • 使用BREW更新节点,使用NPM更新自身
  • 希望这能帮助好奇的人!


    下面是一些步骤,遵循约翰爸爸的文章。

    • 从node js.org/en/download安装node.js

    • NPM最新版本更新:$ npm install npm -g

    • 为NPM全局包$ mkdir ~/.npm-packages创建一个新文件夹

    • 告诉NPM在哪里找到/存储它们$ npm config set prefix ~/.npm-packages

    验证安装

    这应该显示版本

    1
    2
    node -v
    npm -v

    这应显示无错误的NPM和NG。

    1
    npm list -g --depth=0

    希望对你有用,对我有用!


    你可以试试这个

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


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

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

    然后查询最新版本:

    1
    nvm ls-remote

    然后安装最新版本:

    1
    nvm install YOUR_VERSION_HERE

    例子

    1
    nvm install v5.8.0

    如果更改目录/usr/local/lib/npm_modules的权限没有帮助,您应该将用户添加到组(在大多数情况下,这是staff组),该组对/usr/bin目录具有RWX权限。因为NPM试图用/usr/bin/__package__制作symlink

    另外,在更改用户组后不要忘记重新登录


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

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

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


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

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

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

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

    whoami

  • 通过一个非常简单的命令,您可以看到分配给您的组的列表,通常第一个组是您的用户名本身。

    groups

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

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

  • 更新npm和nodejs

    npm install -g npm

  • 你已经设置好了,你的用户可以在没有sudo的情况下运行npm命令

    您也可以参考此链接https://askubuntu.com/a/1115373/687804


    在我看来,最好的选择是NPM文档中建议的,它首先通过运行npm config get prefix来检查默认情况下全局节点模块的安装位置。如果你得到了,就像我对Trusty所做的那样,你可能会想把它改成一个文件夹,你可以安全地拥有它,而不会像我那样把事情搞砸。

    为此,请在系统中选择或创建一个新文件夹。你可能想把它放在你的主目录中,或者像我一样,放在/usr/local下以保持一致性,因为我也是一个mac用户(我不喜欢看不同的地方,这取决于我正好在前面的机器)。另一个很好的原因是,/usr/local文件夹可能已经在您的路径中(除非您想乱弄路径),但很可能新创建的文件夹没有,您需要将其添加到.bash配置文件或.bashrc文件中的路径中。

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

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

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


    最好的解决方案是NPM文档提供的解决方案。

    对于Ubuntu,建议的解决方案是选项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,建议的解决方案是选项3

    在Mac OS上,您可以使用自制包管理器完全避免此问题。

    brew install node


    我发现,如果您只使用sudo -s,"它只是启动一个具有根权限的shell作为一个步骤",它确实对我有用。我不知道这是不是一个好的做法。

    希望有帮助。

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


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

    sudo chown -R $USER /usr/local

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


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


    以上这些都不是必需的。

    我遇到的问题是我在运行NPM时使用了-g。我弄不明白我是如何得不到在我的项目中创建的"NPM模块"文件夹的。

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

    这是一个很好的视频解释