[英]Installing npm modules globally without using sudo and updating the npmrc to install on the specified folder
[英]NPM modules won't install globally without sudo
我剛剛重新安裝了 Ubuntu 12.04 LTS,然后我先執行了以下步驟:
使用以下腳本通過 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
嘗試在全球范圍內安裝 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
遞歸地收回以下文件夾的所有權~/.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
文件中的bin
和scripts
屬性。
一般來說,最安全的做法是:
$HOME/bin
最后放在您的路徑中,這樣系統命令就不會被取代。$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
實際上,我只是更改了 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 。
只需使用 nvm,您就可以在不同的節點版本之間動態切換,並且它會在本地為您的用戶安裝。 不需要 sudo。 只需確保您事先已完全清理舊節點。
為了在本地安裝 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
我有同樣的“權限被拒絕”問題。 我沒有嘗試修復從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.