項目 NodeJS 版本鎖定及自動切換


介紹

隨着項目的增多,舊項目和新項目使用的 node 版本可能差異比較大,在多人協作或者交接項目時,其他開發者的開發環境 node 的版本也不盡相同。因此,我們有必要鎖定每個項目的 node 版本范圍,為了減少工作量,還需實現運行項目時能自動切換到對應的 node 版本。

版本鎖定

要鎖定 node 的版本可以直接在 package.json 中設置,其中 ">=10 <14" 則表明 node 的版本要大於等於 10 小於 14,如果當前 node 版本不在此限定范圍內的話,運行項目的時候終端會拋出提示說 node 的版本有誤,並終止后續執行。

"engines": {
    "node": ">=10 <14",
    "npm": ">= 3.0.0"
},

為了兼容通過 npm 來執行運行項目命令,需要在項目根目錄新建一個文件名為 .npmrc 的配置文件,並加入以下語句。

engine-strict = true

到這里,版本鎖定已完成。

自動切換

之前一直使用 nvm 來對 node 進行多版本管理,為了輕量化,就不引入其它自動切換 node 的版本庫了。由於 nvm 對 Windows 支持不是很完善,建議 Windows 用戶使用 nvs 進行版本管理。假設已經安裝成功 nvm(沒安裝的可以根據官方文檔安裝),我們需要在~/.zshrc文件中加入以下配置:

# place this after nvm initialization!
autoload -U add-zsh-hook
load-nvmrc() {
  local node_version="$(nvm version)"
  local nvmrc_path="$(nvm_find_nvmrc)"

  if [ -n "$nvmrc_path" ]; then
    local nvmrc_node_version=$(nvm version "$(cat "${nvmrc_path}")")

    if [ "$nvmrc_node_version" = "N/A" ]; then
      nvm install
    elif [ "$nvmrc_node_version" != "$node_version" ]; then
      nvm use
    fi
  elif [ "$node_version" != "$(nvm version default)" ]; then
    echo "Reverting to nvm default version"
    nvm use default
  fi
}
add-zsh-hook chpwd load-nvmrc
load-nvmrc

如果你的終端是 bash 或者其它的話,請自行查看官方示例。上面的代碼是當你在項目下打開終端時,nvm 會在當前項目下去找 .nvmrc 文件,因此我們需要在項目根目錄增加此文件,寫入自己想要執行的版本號,如:

13.14.0

倘若你還沒安裝此版本的 node,nvm 則會自動去安裝對應版本的 node 並且自動設為該版本。在項目中打開終端,nvm 就會自動切換到對應的 node 版本啦。

⚠️ 如果沒有自動切換版本,請重新打開終端或者重新通過 cd 指令進入項目目錄

Jenkins 中使用

通過 jenkins 自動化打包部署項目,發現就算按照以上步驟在服務器上進行 nvm 的安裝和配置了,構建部署項目時亦不能進行 node 版本自動切換。調試后發現,jenkins 的構建項目環境並不能找到 nvm 指令,猜測是 jenkins 的運行環境中找不到 nvm 配置。因此,我門可以在 pipeline 中手動執行一下 nvm 配置,如下:

// xxx.groovy
stage('Build') {
		git credentialsId: 'gitlab', url: "${projectScm}"
		sh """
			. ~/.nvm/nvm.sh
			. ~/.bashrc
			node -v
			yarn install
			yarn build
			zip -r dist.zip dist/
		"""
}

保存后,重新執行下項目構建即可。

通過搜索發現還可以通過安裝 Jenkins 的 nvm-wrapper 插件來解決此問題,暫未測試。

參考


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM