NPM模块未使用sudo时无法全局安装

141

我刚刚重新安装了Ubuntu 12.04 LTS,在进行任何其他操作之前,我执行了以下步骤:

  1. 使用以下脚本通过包管理器安装了Node

    sudo apt-get update
    
    sudo apt-get install python-software-properties python g++ make
    
    sudo add-apt-repository ppa:chris-lea/node.js
    
    sudo apt-get update
    
    sudo apt-get install nodejs
    
    尝试全局安装yeoman、express、n,以及yeoman的生成器,但所有这些操作都返回相同的错误:

    npm ERR! Error: EACCES, symlink '../lib/node_modules/n/bin/n'

    npm ERR! { [Error: EACCES, symlink '../lib/node_modules/n/bin/n'] errno: 3, code: 'EACCES', path: '../lib/node_modules/n/bin/n' }

    npm ERR!

    npm ERR! 请尝试使用root/Administrator权限再次运行此命令。

    npm ERR! 系统 Linux 3.8.0-29-generic

    npm ERR! 命令 "/usr/bin/node" "/usr/bin/npm" "install" "-g" "-d" "n"

    npm ERR! 当前工作目录 /home/heberlz

    npm ERR! node -v v0.10.20

    npm ERR! npm -v 1.3.11

    npm ERR! 路径 ../lib/node_modules/n/bin/n

    npm ERR! code EACCES

    npm ERR! errno 3

    npm ERR! stack Error: EACCES, symlink '../lib/node_modules/n/bin/n'

    npm ERR!

    npm ERR! 更多日志详细信息请查看:

    npm ERR! /home/heberlz/npm-debug.log

    npm ERR! 不正确的代码 0

    我已经尝试了多次使用sudo恢复以下文件夹的所有权:~/.npm、/usr/lib/node、/usr/lib/node_modules,以及以下符号链接:/usr/bin/node、/usr/bin/nodejs,但均未成功。
    我需要在不使用sudo的情况下安装yeoman及其生成器,以免日后出现问题。

2
如果您想让npm在$HOME而不是/usr中安装全局软件包,请按照以下指南https://github.com/sindresorhus/guides/blob/master/npm-global-without-sudo.md。 - Colonel Panic
这是我用过的方法 https://github.com/nodejs/node-v0.x-archive/issues/3911#issuecomment-8956154 : ln -s /usr/bin/nodejs /usr/bin/node - Loïc MICHEL
可能是npm在没有sudo的情况下抛出错误的重复问题。 - Louis
17个回答

0

这个问题以及其他由相同原因引起的问题可以通过在用户空间安装Node来解决。

您只需将以下内容复制并粘贴到终端中即可完成操作

NODEJS_ROOT=${NODEJS_ROOT:-~/nodejs}
cd /tmp
wget -N http://nodejs.org/dist/node-latest.tar.gz && tar xzf node-latest.tar.gz
NODEJS_CURRENT=$(tar tf node-latest.tar.gz|head -1)
mkdir -p $NODEJS_ROOT/$NODEJS_CURRENT
cd $NODEJS_CURRENT
./configure --prefix=$NODEJS_ROOT/$NODEJS_CURRENT && make install
cd $NODEJS_ROOT
rm current 2> /dev/null # Removes current symbolic link, if any
ln -s $NODEJS_CURRENT current

同样的命令也可以启动以获取 Node 更新到最新版本。

不要忘记编辑您的环境。只需要一次操作即可完成。

echo "export NODEJS_ROOT=$NODEJS_ROOT"            >> $HOME/.bash_profile
echo 'export PATH=$NODEJS_ROOT/current/bin:$PATH' >> $HOME/.bash_profile
source $HOME/.bash_profile # reload your env, so you can use node right now

看看这篇文章,了解如何在不使用sudo的情况下安装Node.js

如果您想了解更一般的解决方案(即本地安装软件),请参阅dotsoftware


0
为了在本地安装Node.js和npm而无需使用sudo,请打开终端并输入:
 echo 'export PATH=$HOME/local/bin:$PATH' >> ~/.bashrc
    . ~/.bashrc
    mkdir ~/local
    mkdir ~/node-latest-install
    cd ~/node-latest-install
    wget -c http://nodejs.org/dist/node-latest.tar.gz | tar xz --strip-components=1
    ./configure --prefix=~/local
    make install 
    wget -c https://www.npmjs.org/install.sh | sh 

0

我使用 lubuntu 14.04.3,尝试更改 .npm 和 npm 前缀的所有权,更新了我的路径,并在没有使用 sudo 的情况下将 npm 安装到我的主目录。但是路径不正确,所以像 ember 这样的模块无法找到。linuxbew 解决了这个问题,node/npm 快速设置指南 here


0

只需使用 nvm,您就可以动态地在不同的 Node 版本之间切换,并且它是为您的用户本地安装的。无需 sudo。只需确保您已经完全清理了旧的 Node。

https://github.com/nvm-sh/nvm


0

使用 NVM

我遇到了相同的“权限被拒绝”问题。我没有试图修复从 https://nodejs.org/en/ 安装的 NodeJS,因为它会安装到由 root 而非 $USER 拥有的文件夹中,而是使用 NVM(Node 版本管理器)。

  • 安装 NVM:运行 curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.1/install.sh | bash
  • 安装 Node 的一个版本:运行 nvm install 16
  • 使用它:
    • nvm use 16
    • npm install -g yarn

当我使用 NVM 安装的 Node 时,一切都正常工作。


-2
我找到的最佳解决方案是从tar包安装Node.js到用户主目录并链接lib文件夹位置。以下是您需要执行的操作:
这将在~/.local/下安装Nodejs,而不是默认的/usr/local/。
Add this to your ~/.npmrc (create the file if it doesn't exist already):

root =    /home/YOUR-USERNAME/.local/lib/node_modules
binroot = /home/YOUR-USERNAME/.local/bin
manroot = /home/YOUR-USERNAME/.local/share/man
Download the Nodejs source code from nodejs.org and install it under your ~/.local tree:

tar xf node......
cd node........
./configure --prefix=~/.local
make
make install

Create ~/.node_modules symlink. (This directory will be automatically searched when you load modules using require "module" in scripts. I'm not sure why Node doesn't search ~/.local/lib/node_modules by default.)

cd
ln -s .local/lib/node_modules .node_modules
Is ~/.local/bin in your path? Type

which npm
If it says ~/.local/bin/npm, you're done.

Otherwise, do this...

export PATH=$HOME/.local/bin:$PATH
...and add that line to your ~/.profile file, so it'll run every time you log in.

如果在安装软件包时仍然遇到所有权或权限错误,请通过运行以下命令更改~/.local/目录的所有权:

chown -R user:user ~/.local/

现在你应该可以通过 'npm' 安装软件包了

注意:以上所有命令都应该以用户身份运行。不要使用sudo或root登录

绝对不要更改 '/USR/LIB/' 下文件夹的权限。这会导致操作系统不稳定


1
从http://tnovelli.net/blog/blog.2011-08-27.node-npm-user-install.html复制而来,未经授权。 - Tobu

-2

我觉得Pawel Grzybek的解释非常有说服力:它们归结为三个简单的sudo命令,不再需要全局npm安装时使用sudo。

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

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