[抓蟲] npm全域安裝路徑錯誤

很久沒寫angular,最近接了一個小的靜態網站,想要拿牛刀來殺雞XDDD
第一件事情當然就是更新最新的angular cli,但是更新後系統卻跟我說 ng command not found

問題情境

先來看看電腦環境

macos一開始直接裝node後來改裝nvm
node: v9.3.0

既然我們是用nvm那我們安裝的npm global應該是跟著nvm底下跑,但當我下指令 npm i -g @angular/cli 卻一直跑去另一個node version的目錄底下

1
/Users/jimmy/.nvm/versions/node/v6.11.1/bin/ng -> /Users/jimmy/.nvm/versions/node/v6.11.1/lib/node_modules/@angular/cli/bin/ng

因此這樣在目前版本的node目錄中永遠不會有@angular/cli可以使用,但是到底是哪邊的設定影響到呢?

問題排查

nvm版本

第一次先確認的是nvm中的node版本是不是根本就錯誤,因此先把v6.11.1以及v9.3.0版本刪掉,接著重新安裝v9.3.0並且設定為預設

1
2
3
4
nvm uninstall v9.3.0
nvm uninstall v6.11.1
nvm install v9.3.0
nvm alias default v9.3.0

再次安裝cli但還是失敗

重新安裝nvm

因此改成檢查nvm本身是不是正確的,可以參考一下這篇文章Node.js 環境設定-for mac,但我們按照步驟重新做完以後,再次安裝cli還是一樣的結果

npm

最後試著往npm的相關設定找,很剛好的讓我找到了.npmrc在根目錄底下有設定了一個prefix的目錄就是v6.11.1,先註解掉試試看,再次安裝cli果然成功,可以找到ng的指令了

npmrc

試著回想一下為什麼會設定prefix…原來是因為之前vscode的terminal都會一直說prefix有問題,因此找到了一個錯誤的設定,但也剛好能夠解決我的問題,就這樣用下去,設定完以後也一直沒有再使用其他的global套件,因此相安無事到現在orz

但我們還是要來了解一下.npmrc,參考一下官方的文件

prefix的目的是什麼呢,npm的指令全部都會改成到prefix指定的路徑下,而不是目前的node目錄,因此這個如果設定在~/.npmrc就會發生像我一樣的悲劇

結論

要解決問題也要找對資料,不然就可能造成悲劇,其實vscode會報那個錯誤是因為當初我直接安裝node變成用nvm,因此一些設定上錯誤,這次找到其他資料才發現原來問題是在用brew安裝nvm,最後成功解決問題,可以繼續使用angular啦!!