【nvm】关于自动切换Node版本的解决方案

发布时间 2023-10-26 11:13:04作者: 转转1996

本地会开发多个不同的 NodeJS 项目,每个项目可能需要的 Node 版本不同,有的老项目还在用 10.xx ,有的要求 12.xx/14.xx/16.xx/18.xx 。

总之,每个项目都需要不同的 Node 版本。很多时候我都是在启动项目遇到报错了才会意识到要切换 Node 版本。

于是我开始搜寻关于多项目自动切换 Node 版本的解决方案。

于是找到了 vscode-nvmrc 这类的插件,自动切换版本

vscode-nvmrc 设计思路

项目根目录新建.nvmrc文件,这是nvm的官方文件,当使用nvm use时会自动查找这个文件,而windows系统一般使用的是nvm-for-windows,它是由另一个开发者维护的windows版本,并不支持nvm use查找.nvmrc
不过这并不影响vscode插件中实现nvm use功能,只不过了解下.nvmrc是nvm的官方文件
话不多说,上代码,很简单,vscode插件方法vscode.window.onDidChangeWindowState中读取下.nvmrc文件,e.focused表示当vscode窗口显示时触发,切换vscode实例时能够触发,然后调用child_process.exec 运行nvm use

vscode-nvmrc代码仓库

点击查看代码
function resolveRootPathAndNvmuse(context: vscode.ExtensionContext) {
  const workspaceFolders = vscode.workspace.workspaceFolders;
  if (workspaceFolders && workspaceFolders.length > 0) {
    const rootPath = workspaceFolders[0].uri.fsPath;
    if (rootPath) {
      const url = resolve(rootPath, ".nvmrc");
      nvmuse(url, context);
    }
  }
}
  1. 这段代码的主要目的是在 VSCode 扩展中解析工作区的根路径,并检查是否存在一个名为 ".nvmrc" 的文件,然后调用 nvmuse 函数,传递 ".nvmrc" 文件的路径和扩展上下文作为参数。

  2. 扩展上下文 (context):vscode.ExtensionContext 是 VSCode 扩展开发中的一个重要概念,它用于管理扩展的生命周期和资源。通常,扩展需要将其上下文传递给扩展的各个部分,以确保它们可以正确地注册命令、提供功能等。

  3. 获取工作区信息:代码首先使用 vscode.workspace.workspaceFolders 获取当前打开的工作区(Workspace)的文件夹信息。工作区是一个包含一个或多个项目文件夹的容器,允许您协同开发多个相关项目。

  4. 检查工作区文件夹:如果存在一个或多个工作区文件夹 (workspaceFolders),则代码会进一步处理。通常,VSCode 支持多个工作区文件夹,但这段代码只处理第一个文件夹。

  5. 获取工作区根路径:代码使用 workspaceFolders[0].uri.fsPath 获取第一个工作区文件夹的根路径,并将其存储在 rootPath 变量中。

  6. 解析 ".nvmrc" 文件路径:接下来,代码使用 resolve 函数来构建 ".nvmrc" 文件的完整路径,其中 resolve 函数的具体实现不在代码段中,但它通常用于构建文件路径。这个路径会存储在 url 变量中。

  7. 调用 nvmuse 函数:最后,代码调用 nvmuse 函数,传递 ".nvmrc" 文件的路径 (url) 和扩展的上下文 (context) 作为参数。这意味着扩展将执行某些操作,可能是与 Node Version Manager (NVM) 相关的,使用指定的 ".nvmrc" 文件路径。

这其实能满足大部分的需要,但并不能满足我。

我的习惯是将不同类型的项目以服务公司为主体放在VScode中的一个“工作区”内。

而一个服务公司有 admin 项目(node 12.18.0),Vue3项目(node 16.11.0),Vue2项目(node 12.18.0)

于此同时发现了另一个异常:

当我在项目根目录下执行 echo "v16.11.0" > .nvmrc 理论是会创建一个.nvmrc的文件,此时我只需要继续执行 nvm use 就可以快速切换node版本了。

但我却碰到了一个奇怪的异常:

image

无法定位到 .nvmrc 并且执行的是.0.0的版本。

翻阅文档得到答案

If:
PowerShell

❯ nvm use
.0.0
node v.0.0 (64-bit) is not installed.

First, run:

nvm on

Then:
PowerShell

type .\.nvmrc | %{$_ -replace "v",""} | %{nvm install $_}
type .\.nvmrc | %{$_ -replace "v",""} | %{nvm use $_}