介紹
隨着項目的增多,舊項目和新項目使用的 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 插件來解決此問題,暫未測試。