2016-07-15 61 views
6

我正要在家裏啓動一些node.js開發,但是在全局安裝npm軟件包時偶然發現了一些奇怪的行爲。npm爲全局安裝的軟件包設置了奇怪的權限

我用WebStorm作爲我的IDE,並且希望使用ECMAScript6功能,這意味着我必須transpile來源,其WebStorm不使用巴貝爾。

所以,我試圖在全球範圍內安裝巴貝爾:

$ sudo npm install -g babel-cli 

什麼情況是,該文件是從根用戶的所有訪問的罰款,只要babel-cli目錄中的所有文件和目錄看起來不錯我看起來像root。問題是當我嘗試看包,或者使用它,因爲其他用戶:

$ 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的指示here。如果我嘗試更新npm,那麼全局npm目錄也會發生同樣的情況,並且npm變得不可用,除了root

當我列出了全球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所擁有的目錄我看沒有什麼特別的。

當我安裝軟件包時,當然沒有錯誤。

npm和/或節點有問題嗎? Ubuntu有什麼問題嗎?或者我如何安裝節點?可能是什麼原因 這樣的事情發生?

本地安裝工作正常,併爲babel-cli包是安裝它作爲本地開發包可以接受的解決辦法。我仍然想知道在全局安裝軟件包時會發生什麼,以及爲什麼。


問題answered here。問題與npmnode無關。

+0

我使用節點源代碼庫和我沒有看到這些問題。但是,我正在使用較舊的npm運行節點4.4。你是否僅僅爲了babel而遇到他的問題?其他CLI工具如grunt,gulp,bower等呢? – tsturzl

+0

@tsturzl對於我在全球安裝的所有軟件包都是一樣的。 –

+0

永遠不要使用'sudo'和'npm'。你只是在問問題。吹走節點,所有npm模塊和目錄,並以普通用戶權限安裝所有內容。 – xdumaine

回答

5

如果你想在全球範圍內安裝一個軟件包,只需要使用一個命令而不sudo,如:

$ npm install -g <package> 

如果您收到EACCES或權限錯誤,使用sudo應避免,但你應該將修復你的權限,所以NPM可以運行沒有sudo。如果你沒有寫入該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的目錄的所有者更改爲當前用戶的名稱。

如果你想改變故宮的默認目錄,你可以通過創建這個新的文件夾中啓動:

$ mkdir ~/.npm-packages 

然後,您配置NPM使用這個新的文件夾:

$ npm config set prefix '~/.npm-packages' 

你還需要將此新文件夾添加到您的PATH(例如使用〜/ .profile):

export PATH=~/.npm-packages/bin:$PATH 

此時,您可以使用source ~/.profile更新系統變量,並測試以全局安裝軟件包,而不使用sudo

你應該能沒有得到任何權限錯誤,因爲故宮將使用~/.npm-packages文件夾,安裝軟件包。

你可以找到關於在npm documentation就此事提供更多信息。

+0

因爲在'/ usr'下給系統目錄的非特權用戶所有權總是一個糟糕的主意,所以這個答案似乎鼓勵了我。如果您想要在全局安裝模塊(即進入系統,以便其他用戶可以利用它們),您必須以'root'用戶或通過'sudo'來執行。做其他事情是不負責任的 - 在你自己的機器上它是一個問題,但教導開發人員這是正確的方式,然後他們在服務器上執行它,這是一場災難。 – Guss

+0

只有在npm的默認值直接爲'/ usr/local'時纔會提示權限修改,而且答案明確指出如果它位於另一個目錄中,則不應修改權限。另一方面,如果你認爲修改'/ usr/local'的權限仍然是一個壞主意,也許你應該立即向npm打開一個問題(https://github.com/npm/npm/issues)因爲這是官方,記錄和建議的方式來修復權限:https://docs.npmjs.com/getting-started/fixing-npm-permissions – HiDeo

+0

我熟悉那個愚蠢的文件,並且已經有一個關於那個:https://github.com/npm/docs/issues/745。 NPM文檔的所有者(至少)似乎同意。正如她所承諾的,我希望她能儘快解決這個問題。 – Guss

0

如果更改了用戶比你必須執行下列操作之一,因爲當你在那個時候安裝NPM你安裝爲根用戶,但達後您更改用戶和給你的權限錯誤,因爲這表明你做的沒有權限寫入該NPM用來存儲全局包中的目錄和commands.you可以通過解決這個問題: -

使用需要照顧這對你的軟件包管理器。

如果你正在做一個新的安裝在Mac OS節點,你可以使用自制軟件包管理器完全避免這個問題。 Homebrew以正確的權限開箱即用。

brew install node 

OR

改變故宮的默認目錄到另一個目錄

有些時候,你不想改變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 

的不是步驟2-4,您還可以使用相應的ENV變量(例如,如果你不想修改〜/ .profile文件):

NPM_CONFIG_PREFIX=~/.npm-global