我目前正在學習 Angular 和 npm。今天我嘗試在我的 Fedora 上執行此操作npm i -g @angular/cli
,但沒有安裝它,而是在終端機中看到(為了方便起見,我縮短了訊息):
npm WARN checkPermissions Missing write access to /usr/lib/node_modules
所以我去谷歌查了一下這是什麼意思。我發現這個 npm 解釋,這篇文章讓我想到另一篇 npm 文章更詳細地描述此錯誤。後一篇文章指出:
如果您在嘗試全域安裝軟體包時看到 EACCES 錯誤,您可以:
使用節點版本管理器重新安裝 npm(建議),
或者
手動更改npm的預設目錄
作為快速修復,上述兩種解決方案看起來都不錯。
但由於我對 Linux 有一些經驗,我開始想知道:為什麼我必須安裝另一個軟體,或者為什麼我必須更改一些配置?換句話說,為什麼 npm 的預設配置和 Fedora 的預設配置需要我調整其中一個才能不出現任何錯誤?
在問了自己這些問題之後,我認為這種情況可能出在我的 npm 配置中。很可能自安裝以來我沒有更改任何內容,但誰知道呢?所以,我決定重新安裝npm。可以肯定的是,我在卸載後重新啟動了電腦。重新安裝後,我npm i -g @angular/cli
再次嘗試 - 但出現了相同的錯誤。
然後我想:也許不是npm的情況,也許是我安裝的Fedora的情況?我當然不想因為這樣的原因重新安裝 Fedora。所以,我在Google上檢查了Fedora對該目錄的預設權限是否/usr/lib/node_modules
是預設的方式。對於我的目錄,對於/usr
、/usr/lib
和/usr/lib/node_modules
(甚至對於/usr/lib/node_modules/npm
),所有者和群組是root root
並且只有所有者俱有寫入權限。我找到的唯一來源是「Fedora 26 安裝指南」(儘管我安裝了 Fedora 29),該文件建議我查看檔案系統層次結構標準 2.3對於目錄結構。由於我希望node_modules
準確分配 npm 所需的權限,因此我僅檢查/usr
和/usr/lib
。對於/usr
目錄,FHS 似乎沒有說明任何有關權限的內容;對於該/usr/lib
目錄,它指出:
/usr/lib 包含不打算由使用者或 shell 腳本直接執行的目標檔案、函式庫和內部二進位。 [22]
這些資訊也沒有太大幫助。
最終,我得出的結論是,我仍然不明白導致錯誤的真正原因是什麼。所以現在我想問:
- npm 是否必須預設配置為將新套件放入其中
/usr/lib/node_modules
? - 如果是,Fedora 是否為這些目錄設定了應該/應該/可能擁有的一些其他預設權限?
- 如果不是,是否是我不小心更改了 Fedora 安裝對這些目錄的權限?
- 如果不是,是不是我沒有安裝root權限的npm套件?這似乎也是一個修復,但是 npm 文件沒有提到這樣的解決方案。
- 如果不是,是否是我嘗試全域安裝 npm 套件而我不應該安裝的情況?如果有的話,為什麼會有這樣的可能性呢?
- 有什麼我不明白或遺漏的嗎?也許我缺少一些(最新的)文件?
更新:我忘記指出我以普通用戶身份運行所有命令,而不是 root 用戶。
答案1
你沒有說你以什麼用戶身份運行它,但我假設它不是root?在這種情況下,錯誤是正確的,但也是預期的,因為普通使用者不應該能夠安裝到系統目錄。
在任何情況下,您都不應該使用npm
Fedora 打包的 Node.js 來全域安裝軟體包,因為這會讓您在/usr/lib/node_modules
.
不幸的是,與其他語言環境不同,Node.js 不支援兩個單獨的全域模組目錄(一個用於/usr
由系統打包管理的模組,一個用於/usr/local
由語言環境自己的工具管理的模組),因此我們無法在這是一種明智的方式,無需對 npm 進行大量修補,但我們不希望這樣做。即使這樣的分割是可能的,您仍然需要 root 身分才能進行全域安裝,就像使用 perl 或 python 或 ruby 一樣。
據我了解,Node.js 無論如何都不鼓勵全域安裝 - 上游的觀點是,您應該在每個專案中本地安裝專案所需的模組。