NVS —— js 實(shí)現(xiàn)的node版本管理工具
大廠技術(shù)??高級(jí)前端??Node進(jìn)階
點(diǎn)擊上方?程序員成長(zhǎng)指北,關(guān)注公眾號(hào)
回復(fù)1,加入高級(jí)Node交流群
NVS (Node Version Switcher)
NVS 是一個(gè)跨平臺(tái)的 Node.js 的版本切換工具,并且 NVS 本身是用Node.js[1]編寫(xiě)的。
這個(gè)工具顯然是受到其他 Node.js 版本管理器工具的啟發(fā),特別是nvm[2],它借鑒了很多思想和一些命令行語(yǔ)法。
以下是基本的設(shè)置說(shuō)明。有關(guān)設(shè)置 NVS 的更多細(xì)節(jié)和選項(xiàng),請(qǐng)參閱設(shè)置頁(yè)面。[3]
Windows
windows 的 MSI 安裝包可以從NVS releases page on GitHub[4]這里獲得。
你也可以通過(guò)chocolatey[5]安裝:
choco?install?nvs
Mac, Linux
指定安裝路徑,克隆 repo,并輸入安裝命令:
export?NVS_HOME="$HOME/.nvs"
git?clone?https://gitee.com/wsz7777/nvs?"$NVS_HOME"
.?"$NVS_HOME/nvs.sh"?install
這個(gè)nvs.sh是向環(huán)境變量中添加nvs的 shell 方法. 執(zhí)行這個(gè)腳本后,你就可以在命令行中直接使用nvs了。請(qǐng)?zhí)砑舆@個(gè)install命令至~/.bashrc,~/.profile, 或者~/.zshrc文件中。以便該nvs功能在你的 shell 中可用.
對(duì)于 ksh, 這個(gè)腳本nvs.sh需要添加到~/.kshrc中,或者是$ENV的地方。
CI 支持
NVS can be used in a CI environment[6]可以在 Travis CI 中使用。去使用 NVS 測(cè)試下載任何版本的 Node.js 環(huán)境。
基礎(chǔ)使用
下載最新版本的 Node.js:
$?nvs?add?latest
下載 lts 版本的 Node.js:
$?nvs?add?lts
運(yùn)行nvs use去選擇 Node.js 的版本
$?nvs?use?lts
PATH?+=?~/.nvs/node/6.9.1/x64
使用nvs link添加默認(rèn)的 Node.js 版本:
$?nvs?link?lts
Command 介紹
| 命令 | 描述 |
|---|---|
nvs help | 獲取命令的詳細(xì)幫助 |
nvs install | 初始化并使用 NVS |
nvs uninstall | 從 profile 和 environment 中移除 NVS |
nvs --version | 展示 NVS 版本 |
nvs add [version] | 下載某個(gè)版本的 Node.js |
nvs rm | 移除某個(gè)版本的 Node.js |
nvs migrate | 遷移全局的 node_modules |
nvs upgrade [fromver] | 更新當(dāng)前環(huán)境的 Node.js 至最新版本 |
nvs use [version] | 選擇使用某個(gè)版本的 Node.js |
nvs auto [on/off] | 使用 cwd 自動(dòng)切換 |
nvs run | 使用 Node.js 的某個(gè)版本的去執(zhí)行 js 應(yīng)用 |
nvs exec | 使用 Node.js 的某個(gè)版本的去執(zhí)行 可執(zhí)行文件 |
nvs which [version] | 顯示 Node.js 的某個(gè)版本的二進(jìn)制文件的路徑 |
nvs ls [filter] | 展示本地下載的 Node.js 版本列表 |
nvs ls-remote [filter] | 列出可下載的 Node.js 版本 |
nvs lsr [filter] | 同上 |
nvs link [version] | 設(shè)置一個(gè)軟連接指向一個(gè)版本,作為默認(rèn)使用的版本 |
nvs unlink [version] | 刪除指向默認(rèn)版本的鏈接 |
nvs alias [name] [value] | 給某個(gè)版本設(shè)置一個(gè)別名 |
nvs remote [name] [value] | 設(shè)置下載 node 的倉(cāng)庫(kù) |
[version]和[filter]是用來(lái)描述版本的,有以下一些情況
| 情況 | 例子 |
|---|---|
| 完整的版本號(hào) | 15.14.0、0.6.11 |
| 不完整版本號(hào) | 14、15、8 |
| 標(biāo)簽 | lts, latest, Argon |
| 遠(yuǎn)程安裝倉(cāng)庫(kù)名 | node、node/15.12.0 。如果使用 nvs remote 添加了遠(yuǎn)程倉(cāng)庫(kù)名為 taobao 那就可以使用 taobao、taobao/15.13.0 |
| 遠(yuǎn)程倉(cāng)庫(kù)名斜線后的部分 | lts, 4.6.0, 6/x86, node/6.7/x64 |
大概是這樣,可以自行發(fā)掘更多用法。
有關(guān)每個(gè)命令的更多詳細(xì)信息請(qǐng)參閱文檔[7]
互動(dòng)菜單
不帶參數(shù)調(diào)用時(shí),將nvs顯示一個(gè)交互式菜單,用于切換和下載 Node.js 版本。

NVS 使用console-menu[8], 最初 console-menu 是為該項(xiàng)目編寫(xiě)的,然后單獨(dú)發(fā)布。
VS Code 支持
Visual Studio Code 可以使用 NVS 選擇啟動(dòng)或調(diào)試時(shí)要使用的 Node.js 版本。在launch.json(.vscode位于項(xiàng)目根文件夾中的文件夾中)中,添加"runtimeArgs"帶有 NVS 版本字符串的"runtimeExecutable"屬性 ,以及指向nvs.cmd(Windows)或nvs(Mac, Linux)。(如果 NVS 不在 VS Code 的 PATH 環(huán)境變量中,您可能需要指定一個(gè)絕對(duì)路徑,例如"${env:HOME}/.nvs/nvs")
配置示例:launch.json使用 VS Code 使用 NVS 啟動(dòng) Node.js 版本 6.10:
??"configurations":?[
????{
??????"type":?"node",
??????"request":?"launch",
??????"name":?"Launch?Program",
??????"program":?"${file}",
??????"args":?[?],
??????"runtimeArgs":?[?"6.10"?],
??????"windows":?{?"runtimeExecutable":?"nvs.cmd"?},
??????"osx":?{?"runtimeExecutable":?"nvs"?},
??????"linux":?{?"runtimeExecutable":?"nvs"?}
????},
??]
或者,從中刪除版本字符串,"runtimeArgs"從.node-version文件或文件夾中獲取版本。有關(guān)更多詳細(xì)信息,請(qǐng)參見(jiàn)NVS VS Code 文檔[9]或者執(zhí)行命令nvs help vscode.
配置 remotes
nvs remote命令允許配置多個(gè)命名的下載位置。NVS 分別管理來(lái)自不同遠(yuǎn)程位置的版本,因此沒(méi)有版本沖突的風(fēng)險(xiǎn)。默認(rèn)情況下,只有一個(gè)遠(yuǎn)程指向 Node.js 官方版本:
$?nvs?remote
default??node
node?????https://npm.taobao.org/mirrors/node/
這樣就可以從其他來(lái)源獲得構(gòu)建。以下命令序列為 nightly 添加了一個(gè)遠(yuǎn)程 remote,列出了 nightly ,并添加了一個(gè)構(gòu)建:
$?nvs?remote?add?nightly?https://nodejs.org/download/nightly/
$?nvs?lsr?nightly/13
nightly/13.1.1-nightly20191120c7c566023f
...
$?nvs?add?nightly/13
添加其他 remote:
nvs?remote?add?iojs?https://iojs.org/dist/
nvs?remote?add?chakracore?https://nodejs.org/download/chakracore-release/
別名
別名是指遠(yuǎn)程名稱和語(yǔ)義版本的組合。(不對(duì)處理器體系結(jié)構(gòu)進(jìn)行別名。)設(shè)置別名時(shí),可以省略遠(yuǎn)程名稱,在這種情況下,別名是指默認(rèn)的遠(yuǎn)程。在其他任何命令中,都可以使用別名代替版本字符串。
$?nvs?alias?myalias?6.7.0
$?nvs?alias
myalias?default/6.7.0
$?nvs?run?myalias?--version
v6.7.0
$?nvs?which?myalias
~/.nvs/node/6.7.0/x64/bin/node
$?nvs?which?myalias/32
~/.nvs/node/6.7.0/x86/bin/node
別名也可以引用本地目錄[10],從而使 NVS 可以切換到 Node.js 的本地私有版本。
根據(jù)目錄自動(dòng)切換版本
在 Bash 或 PowerShell 中,NVS 可以在更改目錄時(shí)自動(dòng)切換當(dāng)前 Shell 中的 Node.js 版本。默認(rèn)情況下,此功能處于禁用狀態(tài)。使它運(yùn)行nvs auto on。之后,無(wú)論何時(shí)cd或pushd在包含.node-version或.nvmrc[11]文件的目錄下,NVS 都會(huì)相應(yīng)地自動(dòng)切換 Node.js 版本,并在必要時(shí)下載新版本。當(dāng)您cd到達(dá)目錄上方?jīng)]有目錄.node-version或.nvmrc文件的目錄時(shí),將還原默認(rèn)(鏈接)版本(如果有)。
~$?nvs?link?6.9.1
~/.nvs/default?->?~/.nvs/node/6.9.1/x64
~$?nvs?use
PATH?+=?~/.nvs/default/bin
~$?nvs?auto?on
~$?cd?myproject
PATH?-=?~/.nvs/default/bin
PATH?+=?~/.nvs/node/4.6.1/x64/bin
~/myproject$?cd?..
PATH?-=?~/.nvs/node/4.6.1/x64/bin
PATH?+=?~/.nvs/default/bin
Windows 命令提示符中不提供此功能。請(qǐng)用 PowerShell。
手動(dòng)切換使用.node-version
如果您的外殼與自動(dòng)切換不兼容,或者您 ?希望手動(dòng)切換但仍利用其中的任何一個(gè).node-versionor.nvmrc文件,則可以nvs use使用該版本運(yùn)行,也可以auto直接運(yùn)行nvs auto.
$?nvs?use?auto
相當(dāng)于
$?nvs?auto
如何運(yùn)行的
Bootstrapping node
NVS 使用特定于平臺(tái)的shell程序代碼是比較少的,這些代碼通過(guò)自動(dòng)下載 Node.js 的私有副本來(lái)引導(dǎo)工具。引導(dǎo)代碼僅是 Windows 命令腳本,Windows powershell 腳本和幾十行的 POSIX shell 腳本。除引導(dǎo)程序外,shell 腳本還用于將 PATH 更改導(dǎo)出到調(diào)用 shell(單獨(dú)的 Node.js 進(jìn)程無(wú)法執(zhí)行)。但是,所有用于查詢可用版本,下載和安裝 Node.js 以及匹配 npm ,切換版本/體系結(jié)構(gòu)/引擎,卸載,解析和更新 PATH 等的代碼都可以用 JavaScript 編寫(xiě),并且大多數(shù)都是以跨平臺(tái)的方式編寫(xiě)的。
版本切換
NVS 下載 Node.js 版本在NVS_HOME環(huán)境變量指定的目錄下,或者在NVS_HOME未設(shè)置的 NVS 工具目錄下。例如,每個(gè)構(gòu)建都位于基于遠(yuǎn)程名稱,語(yǔ)義版本和體系結(jié)構(gòu)的子目錄中node/6.7.0/x64.
當(dāng)您使用nvs use一個(gè)版本時(shí), 當(dāng)前shell的會(huì)更新PATH為包括該版本的bin目錄.
全局模塊
與 NVS 安裝的 Node.js 一起使用npm install -gornpm link與之配合使用時(shí),將安裝全局模塊或?qū)⑵滏溄拥教囟ㄓ诎姹镜哪夸浿?。(NVS 清除NPM_CONFIG_PREFIX可能已設(shè)置的任何環(huán)境變量。)這意味著,在 NVS 切換版本時(shí),它也在切換可用的全局模塊集。該nvs migrate命令可以將這些全局模塊從一個(gè) Node.js 版本遷移到另一 Node.js 版本。
Symbolic 鏈接
nvs link命令在$NVS_HOME/default指向指定版本(或命令時(shí)的當(dāng)前版本)的位置創(chuàng)建符號(hào)目錄鏈接PATH。當(dāng)需要在其他地方配置固定路徑時(shí),這很有用。
在非 Windows 平臺(tái)上,如果存在鏈接,則提供nvs.sh腳本來(lái)源的新外殼程序也將設(shè)置PATH為包括默認(rèn)版本。在 Windows 上,PATH環(huán)境變量在用戶配置文件中更新,因此新的 Shell 將使用默認(rèn)版本。
nvs ls命令列出所有本地 Node.js 版本,并使用標(biāo)記當(dāng)前路徑中的版本>,并使用標(biāo)記默認(rèn)(鏈接的)版本(如果有)#。這些可以相同或不同。例如:
??node/4.5.0/x64
?#node/4.6.0/x64
?>node/6.7.0/x64
系統(tǒng) linking
如果$NVS_HOME在諸如/usr/localor%ProgramFiles%,nvs link命令還會(huì)鏈接到眾所周知的 Node.js 系統(tǒng)位置。(僅當(dāng)尚無(wú)系統(tǒng)安裝的 Node.js 時(shí)才允許這樣做。)
在非 Windows 平臺(tái)上,為
node創(chuàng)建符號(hào)鏈接/usr/local/bin,npm以及具有可執(zhí)行任何全球安裝的 Node.js 模塊。請(qǐng)注意,在安裝或卸載包含可執(zhí)行文件的全局模塊之后,可能需要再次運(yùn)行nvs link以更新全局鏈接。使用 NVS 鏈接不同版本的 Node.js(具有不同的全局模塊)會(huì)相應(yīng)地更新所有鏈接。在 Windows 上,在創(chuàng)建符號(hào)目錄鏈接
%ProgramFiles%\Nodejs,并將該目錄添加到系統(tǒng)PATH中。
當(dāng)$NVS_HOME指向非系統(tǒng)目錄時(shí),將跳過(guò)此系統(tǒng)鏈接功能,因?yàn)樵谙到y(tǒng)目錄中創(chuàng)建到用戶文件的符號(hào)鏈接是錯(cuò)誤的。
依賴關(guān)系
除了自動(dòng)下載的節(jié)點(diǎn)的私有副本之外,NVS 沒(méi)有任何外部依賴關(guān)系。運(yùn)行時(shí) JS 軟件包的相關(guān)性很小,并且已在存儲(chǔ)庫(kù)中簽入,以避免npm install在引導(dǎo)時(shí)需要。
我組建了一個(gè)氛圍特別好的 Node.js 社群,里面有很多 Node.js小伙伴,如果你對(duì)Node.js學(xué)習(xí)感興趣的話(后續(xù)有計(jì)劃也可以),我們可以一起進(jìn)行Node.js相關(guān)的交流、學(xué)習(xí)、共建。下方加 考拉 好友回復(fù)「Node」即可。
???“分享、點(diǎn)贊、在看” 支持一波??
參考資料
Node.js:?http://nodejs.org/
[2]?nvm:?https://github.com/creationix/nvm
[3]?有關(guān)設(shè)置 NVS 的更多細(xì)節(jié)和選項(xiàng),請(qǐng)參閱設(shè)置頁(yè)面。:?https://gitee.com/wsz7777/nvs/tree/gitee/doc/SETUP.md
[4]?NVS releases page on GitHub:?https://github.com/wsz7777/nvs/releases
[5]?chocolatey:?https://chocolatey.org/
[6]?NVS can be used in a CI environment:?https://gitee.com/wsz7777/nvs/tree/gitee/doc/CI.md
[7]?請(qǐng)參閱文檔:?https://gitee.com/wsz7777/nvs/tree/gitee/doc
[8]?console-menu:?https://gitee.com/wsz7777/console-menu
[9]?NVS VS Code 文檔:?https://gitee.com/wsz7777/nvs/tree/gitee/doc/VSCODE.md
[10]?別名也可以引用本地目錄:?https://gitee.com/wsz7777/nvs/tree/gitee/doc/ALIAS.md#aliasing-directories
[11]?.nvmrc:?https://github.com/nvm-sh/nvm#nvmrc
? ?[12] ? ? ? ??原文鏈接:https://github.com/jasongin/nvs/blob/master/LICENSE.txt
