當前位置: 首頁>>技術教程>>正文


如果沒有sudo,NPM模塊將無法全局安裝

, , , ,

問題描述

我剛剛重新安裝了Ubuntu 12.04 LTS,在執行其他操作之前,請執行以下步驟:

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

    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’]錯誤:3,代碼:’EACCES’,路徑:’../lib/node_modules/n/bin/n’} npm ERR! npm ERR!請嘗試以root /Administrator身份再次運行此命令。 npm ERR!係統Linux 3.8.0-29-通用npm ERR!命令”/usr/bin/node” “/usr/bin/npm” “install” “-g” “-d” “n” npm ERR! cwd /home /heberlz npm錯誤!節點-v v0.10.20 npm ERR! npm -v 1.3.11 npm錯誤!路徑../lib/node_modules/n/bin/n npm ERR!代碼EACCES npm ERR! errno 3 npm錯誤!堆棧錯誤:EACCES,符號鏈接’../lib/node_modules/n/bin/n’ npm ERR! npm ERR!其他日誌記錄詳細信息可以在以下位置找到:npm ERR! /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月:

可從NodeSource Debian和Ubuntu二進製發行版repository獲得Node.js。

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

而已。

過時的答案:

不使用sudo的最快方法如所述here by isaac

I strongly encourage you not to do package management with sudo! Packages can run arbitrary scripts, which makes sudoing a package manager command as safe as a chainsaw haircut. Sure, it’s fast and definitely going to cut through any obstacles, but you might actually want that obstacle to stay there.

I recommend doing this once instead:

sudo chown -R $USER /usr/local

編輯:

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

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

第四種答案

問題是我使用sudo安裝了節點,以避免在全局安裝npm模塊時出現錯誤,一個絕不能使用sudo安裝節點。

我的解決方案是以這種方式重新安裝它:

從nodejs.org下載最新的穩定節點源#在我的情況下為node-v0.10.20.tar.gz

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

cd node-v0.10.20 #enter uncompressed folder

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

npm install -g generator-angular

第五種答案

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

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

對我來說,npm不遵守.npmrc中的”prefix”配置設置。

第六種答案

找到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和共享)使用的sub-folders的權限。

這是完整詳細信息的鏈接

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

參考資料

本文由Ubuntu問答整理, 博文地址: https://ubuntuqa.com/zh-tw/article/9954.html,未經允許,請勿轉載。