基於nvm的Node、NPM的版本管理(NPM permission error的解決)

Booster發表於2019-02-16

最近在使用npm過程中,發現全域性安裝總會遇到permission相關的錯誤,所以總是要在前面加sudo,還得不停輸入密碼。

懶惰使我進步,隨手google了一下相關問題的解決方案,發現npm在官方文件中早有明示How to Prevent Permissions Errors。據其描述,根本原因其實是Node.js安裝包將程式安裝在了一個只有local permissions的地址上(寫入是需要管理員許可權的)。而其提供了兩種修復的方式,其中的推薦方式既是本文要說的nvm的方式。

nvm的優勢

nvm(Node Version Manager)通過對node和npm集中的版本管理主要解決了兩個問題

  1. 統一解決了node和npm版本管理的問題,nvm提供了很方便的機制可以使我們在同一終端上安裝多個版本的node和npm並且提供了快速切換版本的能力,這樣為我們檢測專案相容性和bug定位提供了很大的幫助。
  2. 解決了本文一開始提到的種種permission的相關問題,自此再也不用重複輸入sudo來進行全域性安裝。

nvm的使用

這裡簡單介紹一下nvm在MacOS下的安裝和使用(注,nvm主要還是面向mac os和linux使用者,使用windows的客官請看這裡

安裝之前

在安裝之前,首先應該需要考慮一下是否要保留原有的系統安裝的node。nvm是可以保留原有node來安裝的,也提供了切回system node的方式。

但是要注意
如果系統中存在多使用者,那麼當前安裝的nvm是隻針對你的,其它使用者如果沒有安裝則只能使用到系統安裝的node版本。兩者全域性安裝的node modules地址是不相同的(/usr/local/lib/node_modules/* VS ~/.nvm/versions/node/vX.X.X/lib/node_modules/*)。一定程度上是有版本不一致的風險的。

如果選擇解除安裝原有系統node,這裡有一篇很實用的講解

安裝

安裝方式比較簡單,只要執行以下的指令碼。指令碼clone了專案程式碼,並進行了環境變數的設定。如果出現問題可以檢視github上的trouble shooting。

curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.33.11/install.sh | bash

在安裝完後,關掉終端重開一個新的,輸入以下指令驗證安裝。

command -v nvm       # should return nvm

注:可以使用同一指令碼來自動更新nvm

使用

安裝完後,使用起來就非常簡單明快了,以下是一些常用功能

1. 安裝某一版本的node nvm install

nvm install --lts             #安裝最新的lts版本的node
nvm install node              #安裝最新版本的node
nvm install 6.14.4            #安裝node版本6.14.4

2. 列出所有node版本

nvm ls                    #本機所有版本
nvm ls -remote             #遠端所有版本

3. 切換、使用某一版本的node nvm use

nvm use --lts             #使用最新的lts版本的node
nvm use node              #使用最新版本的node
nvm use 6.14.4            #使用node版本6.14.4

4. 啟動node nvm run

nvm run --lts             #啟動最新的lts版本的node
nvm run node              #啟動最新版本的node
nvm run 6.14.4            #啟動node版本6.14.4 

5. 使用某一版本執行

nvm exec 4.2 node --version

6. 查詢某一版本的安裝位置

nvm which 5.0

node, –lts都是nvm自動維護的別稱,表示最新版本和最新的long-term support版本。
另,system同樣也是別稱,表示node的非nvm安裝的system版本

關於既有的node modules

可以使用--reinstall-packages-from=node來自動在新的node中安裝上一版本已有的node modules

nvm install node --reinstall-packages-from=node        #從上一版本繼承
nvm install 6 --reinstall-packages-from=5              #從某一版本繼承

關於映象

很神祕的是nvm windows很貼心的提供了命令列設定映象的命令,而mvn木有,所以只好手動來。

nvm node安裝映象

1 手動方案,每次執行nvm安裝時,執行

export NVM_NODEJS_ORG_MIRROR=https://nodejs.org/dist
nvm install node

2 永久方案,當然是將export放到~/.bashrc

npm映象

npm install的安裝速度也是很感人的。所以,安裝完node一般會把npm的映象也設定成淘寶滴。

npm config set registry https://registry.npm.taobao.org

注:勸君莫用cnpm,與npm基本無異,然而經常會出一些想不到的bug。

解除安裝

nvm的解除安裝是手動完成的,但是不復雜。

首先,刪掉nvm檔案

$ rm -rf "$NVM_DIR"

隨後,修復環境變數,修改~/.bashrc (如果沒有就去bash_profile找找),刪掉以下這幾行

export NVM_DIR="$HOME/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && . "$NVM_DIR/nvm.sh" # This loads nvm
[[ -r $NVM_DIR/bash_completion ]] && . $NVM_DIR/bash_completion

搞定。

總結

mvn提供了一種管理Node.js版本的便捷方式,不管是安裝、切換、刪除都可以一步到位,無疑是現階段的首選。

相關文章