簡體   English   中英

npm為全局安裝的軟件包設置了奇怪的權限

[英]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包,將它安裝為本地開發包是一種可接受的解決方法。 我仍然想知道在全局安裝軟件包時會發生什么,以及為什么。


這里回答的問題。 問題與npmnode無關。

如果要全局安裝包,只需使用不帶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.

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