在npm中,為什麼有一個目錄預設為全域套件設定了root權限?

在npm中,為什麼有一個目錄預設為全域套件設定了root權限?

我目前正在學習 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]

這些資訊也沒有太大幫助。

最終,我得出的結論是,我仍然不明白導致錯誤的真正原因是什麼。所以現在我想問:

  1. npm 是否必須預設配置為將新套件放入其中/usr/lib/node_modules
  2. 如果是,Fedora 是否為這些目錄設定了應該/應該/可能擁有的一些其他預設權限?
  3. 如果不是,是否是我不小心更改了 Fedora 安裝對這些目錄的權限?
  4. 如果不是,是不是我沒有安裝root權限的npm套件?這似乎也是一個修復,但是 npm 文件沒有提到這樣的解決方案。
  5. 如果不是,是否是我嘗試全域安裝 npm 套件而我不應該安裝的情況?如果有的話,為什麼會有這樣的可能性呢?
  6. 有什麼我不明白或遺漏的嗎?也許我缺少一些(最新的)文件?

更新:我忘記指出我以普通用戶身份運行所有命令,而不是 root 用戶。

答案1

你沒有說你以什麼用戶身份運行它,但我假設它不是root?在這種情況下,錯誤是正確的,但也是預期的,因為普通使用者不應該能夠安裝到系統目錄。

在任何情況下,您都不應該使用npmFedora 打包的 Node.js 來全域安裝軟體包,因為這會讓您在/usr/lib/node_modules.

不幸的是,與其他語言環境不同,Node.js 不支援兩個單獨的全域模組目錄(一個用於/usr由系統打包管理的模組,一個用於/usr/local由語言環境自己的工具管理的模組),因此我們無法在這是一種明智的方式,無需對 npm 進行大量修補,但我們不希望這樣做。即使這樣的分割是可能的,您仍然需要 root 身分才能進行全域安裝,就像使用 perl 或 python 或 ruby​​ 一樣。

據我了解,Node.js 無論如何都不鼓勵全域安裝 - 上游的觀點是,您應該在每個專案中本地安裝專案所需的模組。

相關內容