最近我開始接觸手機 app 的編寫,公司用到了 Nativescript。當我下載了公司的項目后,在配置時出現了不少的問題,其中出現概率最高的就是 EACCES: permission denied 錯誤。這類錯誤在 Nativescript 的官網教程中有特別指出,我也按照其中的提示修改文件權限,但還是有很多時候盡管你使用 sudo,依然會出現權限問題。本文將介紹我是如何解決這個問題的,這個問題也不僅僅出現在使用 Nativescript 時,只要你 npm install 時出現的 EACCES: permission denied 錯誤都可以用以下的解決方案。(歡迎大家留言指出問題,或是解決問題后點個贊)
2019年4月10日更新:之后提到的網站中的內容有所變動,我根據變動修改了前兩個截圖,后面的文字內容也稍有變動。該網站中提到的方法比我當時解決問題時更多些,大家如果英語水平好的話建議自行研究一下內容,也許能找到更合適的解決方法。我就提供我當時的解決方法的過程記錄。
我 clone 了公司項目后,需要執行一系列 npm 的指令進行項目的配置,基本上每個 npm的執行都需要加上 sudo 才能進行一部分,中間還會出現 EACCES: permission denied 錯誤,這個時候,你首先可以使用 sudo chown -R $(whoami) PATH 直接修改你填寫的路徑下的所有子文件夾的權限為你可以讀取和修改,之后就不需要再用sudo了。
然而這個方法並沒有解決我的問題,我在執行 npm platform add ios 時一直有一個錯誤 command npm install tns-ios@4.0.1 --silent --save-exact --save failed with exit code 243 ,然后我意識到我依然沒有成功的修改需要修改的權限,主要是這個文件夾:/Users/NAME/.npm-global/lib/node_modules。
然后我找到了 nvm 官方網站教程中為了預防此類權限錯誤而給的一個文章鏈接。最開始時我嘗試了這篇文章中的第二種方案(Manually change npm’s default directory),其實我直接沒注意到還有第一種方案(Reinstall npm with a node version manager),因為第二種方案直接放出來了代碼比較醒目。
第一種方案(Reinstall npm with a node version manager)就是本文介紹的重點了,也是我認為最好的解決方法。(點開前面提到的文章鏈接,就可看到如下圖所示)
以下為具體的分步驟講解:
1. 前面這個鏈接中的這個方法有一小段文字說明,其中給的鏈接("Downloading and installing Node.js and npm")指向另一章節,當你點開之后,需要將頁面拉至下方 Using a version manager to install Node.js and npm 處,你可以直接查找這段文字。(以下為截圖)
2. 選擇你對應系統的相關鏈接,我是 mac 系統,選擇了箭頭所指的鏈接,點擊后你會看到:
3. 上面頁面里解釋的很詳細,在執行完 curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.33.11/install.sh | bash 后,終端會有提示說你可以重啟終端或者執行以下語句使 nvm 可用,我嘗試過重啟,nvm 並沒有配置好,所以還是需要將給出的提示命令全部復制執行一下,然后執行 nvm --version ,如果輸出了版本型號則成功了。
4. 最開始提到的第一種方法是需要安裝 nvm 然后再重裝 Node.js,現在我們已經安裝好了 nvm,那么就需要執行 nvm install node ,終端會提示這與之前提到的第二種方法里設置的 prefix 沖突,需要執行某某語句來刪除這個 prefix,你就按照提示刪除(我沒截圖並且關了窗口,所以只能描述大概記得的)。
5. 需要再次執行 npm install 時,如果依然出現 EACCES: permission denied 在項目的 /node_modules 下,則刪除項目下 node_modules 文件夾,然后再執行 npm install 重新生成 node_modules 文件夾應該就沒有問題了。
小結
兩個關鍵命令 curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.33.11/install.sh | bash 和 sudo chown -R $(whoami) /Users/$(whoami)/.npm-global/lib/node_modules 。后面這個命令只是針對個別情況,大家按個人需求判斷是否需要執行。如果沒看懂我寫的,建議再仔細看看我給出的英文官方網站。