Node版本控制工具volta
nvm是一个全局级别的Node版本切换工具,可以通过命令来切换当前全局的Node版本
volta是在nvm的全局Node版本切换功能基础上拓展了更为精细的项目级别Node版本切换,将项目与其所需Node版本绑定,确保每个项目都能使用正确的Node版本
volta不仅可以控制Node版本,也可用于控制npm、pnpm、npx、yarn等常用的cil工具
volta的实现原理就是在下载特定版本的软件并存放在工作目录中,然后由一个在Path环境变量中的同名“中转程序”去运行已经存在在工具目录的特定版本的软件
1、“中转程序”会首先在当前目录中查找package.json配置文件 2、如果有该配置文件,检查是否有volta配置项 3、读取volta配置项中的软件版本号 3、从缓存的若干软件版本中运行volta配置项指定的版本 4、如果上面某一步未找到,则运行默认软件版本 volta与nvm最大的不同就是会在当前目录查找package.json配置文件并根据配置信息运行指定版本的软件,这样就做到了项目级别的版本控制
volta的安装
volta的Github开源网址:点击打开
我们可以下载安装版本,安装后自动设置环境变量
也可以下载压缩版本,添加解压缩后的根目录到Path环境变量
解压缩后有三个编译好的二进制程序文件
volta.exe 主程序 volta-shim.exe 中转程序 volta-migrate.exe 迁移程序,检测已安装的Node版本和全局npm包,然后将这些信息迁移到Volta配置中
复制volta-shim.exe中转程序并重命名为我们要中转的软件名
cd /d <根目录> copy /b volta-shim.exe node.exe copy /b volta-shim.exe npm.exe copy /b volta-shim.exe pnpm.exe copy /b volta-shim.exe yarn.exe
如果当前目录存在运行命令的同名中转程序,会导致无限递归导致电脑卡死,如在包含npm.exe中转程序的目录中运行npm命令
volta工作目录
volta默认工作目录为"%LOCALAPPDATA%\Volta",可以通过设定"VOLTA_HOME"环境变量来指定工作目录
"tools/inventory"中为下载的软件压缩包
"tools/image"中为软件解压目录,中转软件实际运行的就是该目录中的程序
"bin"中为安装的一些命令行工具(如bun、ts),如果需要也要将该目录添加至Path环境变量中,也可以运行volta setup命令
volta常用命令
fetch 下载指定版本的软件并添加到工具链中 install 下载指定版本的软件并添加到工具链中,然后设置为全局默认版本 uninstall 从工具链中删除指定软件,注意node、npm、pnpm等暂不支持删除命令,可以手动删除解压缩后的目录 pin 设置以当前目录为根目录的项目级别的软件版本 list 显示当前的工具链 which 打印指定命令的实际运行文件路径 setup 将"VOLTA_HOME\bin"添加到当前用户的Path环境变量中 run 一次性的使用指定软件的指定版本运行命令 --node <version> --npm <version> --pnpm <version> --yarn <version> --env <NAME=value> 设置运行时的环境变量,可以多次使用来设置多个环境变量
当指定软件及版本时使用使用"name@version"格式
volta下载配置
当我们使用volta fetch/install命令会下载指定软件的特定版本,默认会从官网下载,但有时候官网访问的速度很慢,这时需要指定下载的镜像网址
配置文件名称为hooks.json,全局配置文件位在环境变量"VOLTA_HOME"目录中,项目配置文件在项目根目录的".volta"目录中
每个软件名为key,值为该软件的配置项,每个软件有三个配置项,index、latest和distro
index 用于获取该软件所有版本列表的URL latest 用于确定该软件最新版本的URL distro 用于下载的url格式
提供的URL可以为bin、prefix和template三种类型中的一种
bin 指定一个二进制程序,会自动运行该程序并从运行后的stdout中读取URL,相对路径表示相对于该配置文件 prefix 指定一个网址的前缀,会自动根据请求网址的不同添加特定的后缀,如 node中的index和latest会自动添加index.json npm中的index会自动添加npm,由于安装npm时会自动根据当前node版本进行版本选择,所以npm中配置的latest不生效 template 指定一个固定的字符串模板,字符串中可以使用一些变量,变量使用双大括号包含{{ key }} {{os}} 当前系统名,如Darwin、Linux 或 Win {{arch}} 当前系统架构,如 x86 、 x64 {{version}} 将要下载软件的版本 {{filename}} 将要下载的文件名 {{ext}} 适合于当前系统的软件压缩拓展名
配置文件示例
{ "node": { "index": { "prefix": "https://mirrors.aliyun.com/nodejs-release/" }, "latest": { "prefix": "https://mirrors.aliyun.com/nodejs-release/" }, "distro": { "template": "https://mirrors.aliyun.com/nodejs-release/v{{version}}/node-v{{version}}-{{os}}-{{arch}}.zip" } }, "npm": { "index": { "prefix": "https://registry.npmmirror.com/" }, "distro": { "template": "https://registry.npmmirror.com/npm/-/npm-{{version}}.tgz" } } }
volta项目配置
volta实现项目级别的版本控制是依靠当前目录下package.json配置文件中的volta配置项来实现的
当项目中有子项目时子项目不会遵循父项目的volta版本控制,会使用软件全局默认版本
如果子项目也需要版本控制那么需要单独在子项目的根目录下运行volta pin来指定版本
当项目比较复杂,多个子项目都在使用版本控制时,如果一般版本需要改变,那么需要对每个子项目进行修改,比较繁杂
针对此问题,volta为我们提供了类似于"文件引用"的功能,我们可以使用extends配置项在子项目中引用父项目的配置文件
父项目配置项 { "volta": { "node": "12.16.1", "yarn": "1.22.4" } } 在子项目中引用 { "volta": { "extends": "../package.json", "node": "12.18.1" } } 在子项目引用时使用的相对路径是相对于子项目配置文件所在目录的 一旦使用了"文件引用",被引用的配置文件会覆盖自身同名配置,上例中子项目中的node版本12.18.1不生效
这样多个子项目通过"文件引用"的功能来统一遵循一个版本控制,当版本需求改变时,仅需要修改被引用的配置文件即可