如果没有 sudo,NPM 模块将无法在全球范围内安装

我刚刚重新安装了 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
    
  2. Tried to install yeoman, express, n, yeoman's generators globally and all of them returned the same error

    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! Please try running this command again as root/Administrator.

    npm ERR! System Linux 3.8.0-29-generic

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

    npm ERR! cwd /home/heberlz

    npm ERR! node -v v0.10.20

    npm ERR! npm -v 1.3.11

    npm ERR! path ../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! Additional logging details can be found in:

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

    npm ERR! not ok code 0

  3. Reclaimed ownership of the following folders recursively ~/.npm, /usr/lib/node, /usr/lib/node_modules, and of the following symlinks /usr/bin/node, /usr/bin/nodejs with absolutely no success

I need to install yeoman and its generators without sudo not to be in trouble later on :(

97050 次浏览

问题是我使用 sudo 安装节点,以避免在全局安装 npm 模块时出错。

我的解决办法是这样对待 重新安装节点:

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

Tar-zxf node-v0.10.20.tar.gz # unpress source

Cd node-v0.10.20 # 输入未压缩的文件夹

Sudo chown-R $USER/usr/local

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

需要注意的一点是,在我的示例中,仅获取/usr/local 文件夹的所有权是不起作用的,因为节点安装本身是使用 sudo 进行的

安装 yeoman 的最后一步: # 虽然在 yeoman.io 上说“ npm install-g yo”已经安装了 bower 和 grunt,但是 grunt 的一些子模块失败了,所以我自己安装了它

Npm install-g bower

Npm install-g grunt

Npm install-g yo

角度发电机

至于2014年10月:

Js 可以从 NodeSource Debian 和 Ubuntu 二进制发行版 储存库获得。

curl -sL https://deb.nodesource.com/setup | sudo bash -
sudo apt-get install -y nodejs

就是这样。

过时的回答:

不使用 sudo 的最快方法是使用 作者: Isaac

我强烈建议您不要使用 sudo 进行包管理! 包可以运行任意的脚本,这使得 sudoing 成为一个包 经理的命令就像电锯理发一样安全。当然,它很快,而且 肯定能够突破任何障碍,但是实际上 希望那个障碍留在那里。

我建议这样做一次:

sudo chown -R $USER /usr/local

编辑:

在将/usr/local 的所有权更改为当前用户时,存在某些安全问题和功能限制:

话虽如此,但是如果您不想使用 sudo 安装全局模块,我认为没有比上面提到的更好的解决方案(从实用的角度来看)。安全性与易用性是一个非常宽泛的话题,这个问题没有简单的答案——它只是取决于您的需求。

Ubuntu 12.04和使用 Chris Lea 的 PPA 来安装以下软件对我来说很有用:

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

$HOME/.npm-packages/bin加入到 $PATH

附加到 .bashrc

export PATH="$PATH:$HOME/.npm-packages/bin"

有关更多信息,请参见来自@passy 的 这个答案

根据这篇类似的文章: Npm 在没有 sudo 的情况下抛出错误

看起来您可能与 ~/.npm目录有所有权问题。

就像那个问题的答案一样,试试看:

sudo chown -R `whoami` ~/.npm

我用环境变量和 shell 别名解决了这个问题:

export NPM_PREFIX=$HOME/node
alias npmg="npm -g --prefix $NPM_PREFIX"

对我来说,npm 没有遵守.npmrc 中的“前缀”配置设置。

我找到的最佳解决方案是从 tar 包安装 Node.js 到用户 home 目录并链接 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/dir 的所有权

chown -R user:user ~/.local/

现在可以通过‘ npm’安装软件包了

注意: 以上所有命令都将作为用户运行。请不要使用 SUDO 或 ROOT LOGIN

永远不要更改“/USR/LIB/”下文件夹的权限。这将导致操作系统不稳定

如果您的路径中已经有了 $HOME/bin,那么一个更简单的解决方案就是..。

npm config set prefix ~
  • 现在,新的节点命令将安装到 $HOME/bin目录中。
  • 不需要改变你的道路!

因为这个讨论实际上是关于降低运行 sudo的安全风险的,所以您还应该注意,任何节点应用程序都可能安装与您认为正在安装的已注册节点包名称不匹配的应用程序名称。因此,存在一个安全风险,即 npm install将替换现有的系统命令或 $HOME/bin中已有的系统命令。如果你担心,检查 binscripts属性在 package.json文件的应用程序,你正在安装第一。

一般来说,最安全的做法是:

  • (a)将 $HOME/bin放在路径的最后,这样系统命令就不会被取代。
  • (b)不包括「或者任何相对路径,这样你就不会不小心运行一个恰好在工作目录中的命令。

参考文献:

如果您使用的是开发机器,那么最好考虑使用 是的

如果没有,您只需要使用您喜欢的包管理器进行安装。

不管是什么情况,我都推荐 检查堆栈溢出的答案

这个问题和其他引起的相同原因可以解决安装节点在用户空间。

你只需要在你的终端上复制粘贴就可以了

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

实际上,我只是更改了 root 用户文件夹的权限:

sudo chown -R $USER ~/.config/configstore

然后我可以“ npm 安装”和“鲍尔安装”没有 sudo! 效果很好!

使用 lubuntu 14.04.3,我尝试更改。Npm 和 npm 前缀,更新我的路径,npm 安装模块到我的主目录没有 sudo,但路径是不正确的,所以模块,如琥珀没有找到,Linuxbew解决了这个问题,快速设置指南 给你为节点/npm

我发现 Pawel Grzybek 的解释非常有说服力: 它们可以归结为3个简单的 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

找到 npm 目录的路径:

npm config get prefix

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

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

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

这会更改 npm 和其他一些工具(lib/node _ module、 bin 和 share)使用的子文件夹的权限。

以下是详细信息的链接

Https://docs.npmjs.com/getting-started/fixing-npm-permissions

只要使用 nvm 您将能够在不同的节点版本之间动态切换,并且它是为您的用户本地安装的。不需要 sudo。只要确保事先完全清理了旧节点即可。

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

为了在本地安装 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

使用 NVM

我也有同样的“拒绝许可”问题。我没有尝试修复从 https://nodejs.org/en/安装到 root而不是 $USER所拥有的文件夹中的 NodeJS,而是使用了 NVM。节点版本管理器节点版本管理器。

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

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