[英]npm sets weird permisions for packages installed globally
我准備在家里開始一些node.js開發,但在全局安裝npm軟件包時偶然發現了一些奇怪的行為。
我使用WebStorm作為我的IDE,並希望使用ECMAScript6功能,這意味着我必須通過使用Babel來轉換WebStorm所做的來源。
所以我嘗試在全球范圍內安裝Babel:
$ sudo npm install -g babel-cli
發生的事情是,root用戶可以很好地訪問這些文件,只要我看作root
用戶, babel-cli
目錄及其中的所有文件和目錄看起來都很好。 當我嘗試查看包或使用它作為另一個用戶時出現問題:
$ ls -l /usr/lib/node_modules/babel-cli/
ls: cannot access '/usr/lib/node_modules/babel-cli/lib': Permission denied
ls: cannot access '/usr/lib/node_modules/babel-cli/index.js': Permission denied
ls: cannot access '/usr/lib/node_modules/babel-cli/scripts': Permission denied
ls: cannot access '/usr/lib/node_modules/babel-cli/node_modules': Permission denied
ls: cannot access '/usr/lib/node_modules/babel-cli/package.json': Permission denied
ls: cannot access '/usr/lib/node_modules/babel-cli/README.md': Permission denied
ls: cannot access '/usr/lib/node_modules/babel-cli/bin': Permission denied
total 0
d????????? ? ? ? ? ? bin/
d????????? ? ? ? ? ? lib/
d????????? ? ? ? ? ? node_modules/
d????????? ? ? ? ? ? scripts/
-????????? ? ? ? ? ? index.js
-????????? ? ? ? ? ? package.json
-????????? ? ? ? ? ? README.md
我安裝哪個包無關緊要,它們都變成這樣。
我在Ubuntu 16.04上使用node.js v6.3.0和npm 3.10.3。
我按照這里的說明新安裝了node.js。 如果我嘗試更新npm
那么全局npm目錄也會發生同樣的情況,並且除了root
之外,npm變得不可用。
當我將全局node_modules
列為我看到的用戶時
$ ll /usr/lib/node_modules/
total 8,0K
drwxr--r-- 6 nobody root 4,0K jul 15 23:50 babel-cli/
drwxr-xr-x 10 root root 4,0K jul 15 23:21 npm/
除了nobody
擁有的目錄,我nobody
看到什么特別的。
安裝軟件包時當然沒有錯誤。
npm和/或節點有問題嗎? Ubuntu有問題嗎? 或者我如何安裝節點? 這樣的事情發生的原因是什么?
在本地安裝工作正常,對於babel-cli
包,將它安裝為本地開發包是一種可接受的解決方法。 我仍然想知道在全局安裝軟件包時會發生什么,以及為什么。
這里回答的問題。 問題與npm
和node
無關。
如果要全局安裝包,只需使用不帶sudo
的命令:
$ npm install -g <package>
如果您收到EACCES或權限錯誤,應該避免使用sudo
但您應該修改您的權限,以便npm可以在沒有sudo
情況下運行。
如果您沒有寫入npm用於存儲全局包的文件夾的權限,則會引發這些錯誤。 要解決這個問題,您可以先找到npm默認目錄的路徑:
$ npm config get prefix
在大多數系統上,它將是/usr/local
,您將能夠修復此文件夾的權限。 如果文件夾是/usr
或/usr/lib
,則不應更改此目錄的權限,因為它會導致一些問題,在這種情況下,您不希望更改默認目錄的權限,您可以將npm配置為使用不同的目錄。
如果您可以並且想要更改默認文件夾的權限,則可以使用:
$ sudo chown -R $(whoami) $(npm config get prefix)/{lib/node_modules,bin,share}
它會將npm目錄的所有者更改為當前用戶的名稱。
如果要更改npm的默認目錄,可以從創建此新文件夾開始:
$ mkdir ~/.npm-packages
然后,配置npm以使用此新文件夾:
$ npm config set prefix '~/.npm-packages'
您還需要將此新文件夾添加到PATH
(例如使用〜/ .profile):
export PATH=~/.npm-packages/bin:$PATH
此時,您可以使用source ~/.profile
更新系統變量並測試以在不使用sudo
情況下全局安裝軟件包。
您應該能夠安裝該軟件包而不會出現任何權限錯誤,因為npm將使用~/.npm-packages
文件夾。
您可以在npm文檔中找到有關此問題的更多信息。
如果您更改用戶而不是必須執行以下操作之一,因為當您安裝npm時,您將以root用戶身份安裝,但是在用戶之后您更改了用戶,這會給您權限錯誤,因為這表示您沒有權限寫入npm用於存儲全局包和命令的目錄。您可以通過以下方式解決此問題: -
使用包管理器來處理這個問題。
如果您在Mac OS上進行全新安裝節點,則可以使用Homebrew包管理器完全避免此問題。 Homebrew使用正確的權限開箱即用。
brew install node
要么
將npm的默認目錄更改為另一個目錄
有時您不想更改npm使用的默認目錄(即/ usr)的所有權,因為這可能會導致一些問題,例如,如果您與其他用戶共享系統。
相反,您可以配置npm以完全使用不同的目錄。 在我們的例子中,這將是我們的主文件夾中的隱藏目錄。
為全局安裝創建一個目錄:
mkdir ~/.npm-global
配置npm以使用新的目錄路徑:
npm config set prefix '~/.npm-global'
打開或創建一個〜/ .profile文件並添加以下行:
export PATH=~/.npm-global/bin:$PATH
返回命令行,更新系統變量:
source ~/.profile
測試:在不使用sudo的情況下全局下載軟件包。
npm install -g babel-cli
您也可以使用相應的ENV變量代替步驟2-4(例如,如果您不想修改〜/ .profile):
NPM_CONFIG_PREFIX=~/.npm-global
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.