本地会开发多个不同的 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
点击查看代码
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);
}
}
}
-
这段代码的主要目的是在 VSCode 扩展中解析工作区的根路径,并检查是否存在一个名为 ".nvmrc" 的文件,然后调用
nvmuse
函数,传递 ".nvmrc" 文件的路径和扩展上下文作为参数。 -
扩展上下文 (
context
):vscode.ExtensionContext
是 VSCode 扩展开发中的一个重要概念,它用于管理扩展的生命周期和资源。通常,扩展需要将其上下文传递给扩展的各个部分,以确保它们可以正确地注册命令、提供功能等。 -
获取工作区信息:代码首先使用
vscode.workspace.workspaceFolders
获取当前打开的工作区(Workspace)的文件夹信息。工作区是一个包含一个或多个项目文件夹的容器,允许您协同开发多个相关项目。 -
检查工作区文件夹:如果存在一个或多个工作区文件夹 (
workspaceFolders
),则代码会进一步处理。通常,VSCode 支持多个工作区文件夹,但这段代码只处理第一个文件夹。 -
获取工作区根路径:代码使用
workspaceFolders[0].uri.fsPath
获取第一个工作区文件夹的根路径,并将其存储在rootPath
变量中。 -
解析 ".nvmrc" 文件路径:接下来,代码使用
resolve
函数来构建 ".nvmrc" 文件的完整路径,其中resolve
函数的具体实现不在代码段中,但它通常用于构建文件路径。这个路径会存储在url
变量中。 -
调用
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版本了。
但我却碰到了一个奇怪的异常:
无法定位到 .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 $_}
标签:Node,use,workspaceFolders,vscode,解决方案,nvmrc,nvm
From: https://www.cnblogs.com/zhuanzhuan1996/p/17788760.html