2014年9月13日

npm - 為什麼在Windows底下更新npm無效

這篇談論的是在Windows底下,使用Node.js msi檔安裝Node.js後,輸入npm update npm –g 無法更新的原因與解決方案 ( 其實也沒有解決方案啦… )

透過Node.js的msi安裝的npm,是無法透過npm update npm -g來更新npm版本的,按下去是沒有反應的…那是因為用msi安裝的npm,預設是放在Program Files\nodejs\npm底下,然後透過PATH來指定到Program Files\nodejs\npm底下的npm,但真正Global的位置卻是在users\skychang\AppData\Roaming\npm底下,換言之,透過msi安裝的npm不是在Global,也因此透過-g指令,是無法更新的… ( 因為Global裡面本來就沒有npm,而是放在Program Files\nodejs\npm底下 )。

當然,我們可以用npm install npm -g再安裝一次npm到global底下。( 但這也要小心…等下會解釋到…平常沒事,也不建議這樣做… )

或是進入到c:\program files\nodejs,使用npm update npm來裝… ( 但是同上,要小心… )

image

當用npm install npm -g安裝到global,或是進入目錄更新npm,要注意第一件事情;必須使用專用的Node.js command prompt才能優先找到Global的npm,那是因為PATH路徑順序的問題,可以看下圖,下半段是Node.js command prompt PATH,上半段是一般的PATH,可以發現,下半段的順序,會先吃到Users\skychang\AppData\Roaming\npm;但上半段則是會先吃到Program Files\nodesjs。

image_thumb24

另外,要注意的第二件事情,當使用了npm install npm –g 將npm裝到Global後,要重新於安裝npm的目錄下重新設定.npmrc這個檔案,不然你會發現,Globalconfig、prefix的路徑都不是指向原本的AppData\Roaming底下了…( 變成Global是吃C:\Program Files\nodejs\etc\npmrc這個檔案 )

另外…prefix這邊( 可以透過npm config ls –l 列出詳細資訊,詳細資訊請參考下圖 ),對應的是C:\\Program Files\nodejs,也不是AppData\Roaming底下了…

image_thumb2

換言之,就代表,如果你未設定.npmrc,那未來你安裝Global的套件,預設會變成安裝到C:\\Program Files\nodejs底下…這是一件很可怕的事情啊XDD ( 而且整個可能會錯亂掉… )

所以,當更新完npm後,要不就是針對User在C:\Users\skychang\設定.npmrc,要不然就是要在C:\Program Files\nodejs\node_modules\npm底下重新改寫.npmrc,而且要調整一些Config…

所以,在這邊還是建議,沒有特別必要更新npm的話,跟著msi版本就好…,當msi版本更新,在重裝就好…不然改錯、遺忘、或是又在一次更新npm的時候,放在C:\Program Files\nodejs\node_modules\npm底下的東西都會被刪除掉…

最後,底下是沒更新時候,預設的設定檔;我們可以看到prefix已經被overridden了,所以會將Global安裝到Roaming底下…而Globalconfig等參數,也不是指向C:\Program Files\nodejs\,而是指到AppData\Roaming…

image_thumb4

而實際上,因為用msi裝的,所以npm並非Global,所以他是吃自己底下的npmrc檔案,而裡面可以看到,他重新定義了prefix。

image_thumb6

但是因為我們更新了npm,所以上面那些東西在更新後,就全部都不見了XDD,所以都要重新設定…

結論

如果真的要更新…就別忘了去改.npmrc檔案,而這個.npmrc檔案,你可以放在User\xxxx底下 ( 但就不能大家共用 ),或是C:\Program Files\nodejs\node_modules\npm底下.. ( 但更新的時候,就bye bye了… )。

而更新檔的內容,也要調整Global等相關設定、Prefix等相關設定…

所以其實滿吃力不討好的… ( 當然,如果你是神人階級的例外啦XDD )

另外,就是完全不要使用msi安裝包來安裝…而是先下載nodejs.exe檔案,然後npm再從Github抓下來後編譯,也是一個辦法啦…但這就會要自己設定%PATH%等相關路徑… ( 老實說,小弟也很懶得搞這些… )

So…除非必要,不然就不要更新npm吧,真的要更新,就透過msi檔來更新吧…是比較輕鬆的方法嚕…

參考資料

沒有留言:

張貼留言