簡體   English   中英

NPM 模塊不會在沒有 sudo 的情況下全局安裝

[英]NPM modules won't install globally without sudo

我剛剛重新安裝了 Ubuntu 12.04 LTS,然后我先執行了以下步驟

  1. 使用以下腳本通過 package 管理器安裝節點

    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. 嘗試在全球范圍內安裝 yeoman, express, n, yeoman 的生成器,它們都返回相同的錯誤

    npm ERR:錯誤,EACCES。 符號鏈接'../lib/node_modules/n/bin/n'

    npm ERR:{ [錯誤,EACCES。 符號鏈接'.:/lib/node_modules/n/bin/n'] errno,3:代碼,'EACCES':路徑。 '../lib/node_modules/n/bin/n' }

    npm 錯誤!

    npm 錯誤。 請嘗試以 root/管理員身份再次運行此命令。

    npm 錯誤。 系統 Linux 3.8.0-29-通用

    npm 錯誤! 命令“/usr/bin/node”“/usr/bin/npm”“安裝”“-g”“-d”“n”

    npm 錯誤! cwd /home/heberlz

    npm 錯誤。 節點-v v0.10.20

    npm 錯誤。 npm -v 1.3.11

    npm 錯誤。 路徑../lib/node_modules/n/bin/n

    npm 錯誤! 代碼 EACCES

    npm 錯誤! 錯誤號 3

    npm ERR:堆棧錯誤,EACCES。 符號鏈接'../lib/node_modules/n/bin/n'

    npm 錯誤!

    npm ERR:其他日志記錄詳細信息可在以下位置找到:

    npm 錯誤。 /home/heberlz/npm-debug.log

    npm 錯誤! 不好的代碼 0

  3. 遞歸地收回以下文件夾的所有權~/.npm、/usr/lib/node、/usr/lib/node_modules 和以下符號鏈接 /usr/bin/node、/usr/bin/nodejs絕對沒有成功

我需要在沒有 sudo 的情況下安裝 yeoman 及其生成器,以免以后遇到麻煩:(

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 看到https://stackoverflow.com/a/18277225

如果您的路徑中已經有$HOME/bin ,一個更簡單的解決方案就是......

npm config set prefix ~
  • 新節點命令現在將安裝到您的$HOME/bin目錄中。
  • 無需更改路徑!

由於此討論實際上是關於降低運行sudo的安全風險,因此您還應該注意,任何節點應用程序都可能安裝與您認為正在安裝的已注冊節點包名稱不匹配的應用程序名稱。 因此,存在安全風險,即npm install將替換現有的系統命令或您在$HOME/bin已有的命令。 如果您擔心,請先檢查您要安裝的應用程序的package.json文件中的binscripts屬性。

一般來說,最安全的做法是:

  • (a) 將$HOME/bin最后放在您的路徑中,這樣系統命令就不會被取代。
  • (b) 不包括“。” $PATH任何相對路徑,這樣您就不會意外運行恰好在當前目錄中的命令。

參考:

至於 2014 年 10 月:

Node.js 可從 NodeSource Debian 和 Ubuntu 二進制發行版存儲庫獲得

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

就是這樣。

過時的答案:

不使用 sudo 的最快方法就像isaac 在此處描述的那樣

我強烈建議您不要使用 sudo 進行包管理! 包可以運行任意腳本,這使得 sudo 包管理器命令就像電鋸理發一樣安全。 當然,它很快並且肯定會穿過任何障礙,但您實際上可能希望該障礙留在那里。

我建議這樣做一次:

sudo chown -R $USER /usr/local

編輯:

將 /usr/local 的所有權更改為當前用戶存在某些安全問題和功能限制:

話雖如此,如果您想在不使用 sudo 的情況下安裝全局模塊,我認為沒有比上面提到的更好的解決方案(從實用的角度來看)。 安全性與易用性是一個非常廣泛的話題,對此沒有簡單的答案——這取決於您的要求。

問題是我使用 sudo 安裝了節點,以避免在全局安裝 npm 模塊時出錯,永遠不要使用 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 #進入解壓文件夾

須藤 chown -R $USER /usr/local

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

需要注意的一件事是,僅獲得 /usr/local 文件夾的所有權在我的情況下不起作用,因為節點安裝本身是使用 sudo 進行的

安裝 yeoman 的最后一步:#although at yeoman.io 它說執行“npm install -g yo”已經安裝了 bower 和 grunt,有一些 grunt 的子模塊失敗,所以我通過自己安裝來解決這個問題

npm install -g bower

npm install -g grunt

npm install -g yo

npm install -g 生成器角度

我用環境變量和shell別名解決了這個問題:

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

對我來說,npm 不支持 .npmrc 中的“前綴”配置設置。

找到 npm 目錄的路徑:

npm config get prefix

對於許多系統,這將是 /usr/local。

將 npm 目錄的所有者更改為當前用戶的名稱(您的用戶名!):

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

這會更改 npm 和其他一些工具(lib/node_modules、bin 和 share)使用的子文件夾的權限。

這是完整詳細信息的鏈接

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

根據這個類似的SO帖子: npm throws error without sudo

看起來您可能對~/.npm目錄存在所有權問題。

與那個答案一樣,請嘗試:

sudo chown -R `whoami` ~/.npm

如果您使用的是開發機器,則最好考慮使用nvm

如果沒有,您只想使用您喜歡的包管理器進行安裝。

不管是什么情況,我都建議在stackoverflow上查看這個答案

實際上,我只是更改了 root 擁有的用戶文件夾的權限:

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

然后我可以在沒有 sudo 的情況下“npm install”和“bower install”! 工作得很好!

這個問題和其他由相同原因引起的問題可以通過在用戶空間安裝 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

使用 lubuntu 14.04.3,我嘗試更改 .npm 和 npm 前綴的所有權,更新我的路徑,npm 安裝模塊到我的主目錄,沒有 sudo 但路徑不正確所以沒有找到像 ember 這樣的模塊, linuxbew解決了這個問題,很快此處為 node/npm 的設置指南

只需使用 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 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 時,一切正常。

我發現的最佳解決方案是將 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/ dir 的所有權

chown -R user:user ~/.local/

現在你應該可以通過“npm”安裝軟件包了

注意:以上所有命令都以用戶身份運行。 不要使用 SUDO 或 ROOT 登錄

永遠不要更改“/USR/LIB/”下文件夾的權限。 將導致不穩定的操作系統

我發現Pawel Grzybek 的解釋非常有說服力:它們歸結為 3 個簡單的 sudo 命令,無需再次使用 sudo 進行全局 npm 安裝:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM