一、NVM简介
nvm(Node Version Manager)是一个用于管理多个Node.js版本的工具,它允许你在同一台机器上安装和切换不同的Node.js版本,而nvm-windows则是在Windows上使用的nvm版本。
二、nvm-windows工作原理简介
在实际使用过程中,我发现nvm-windows会在环境变量中加入NVM_HOME(配置中的root目录)和NVM_SYMLINK(配置中的path目录),这两个目录可以在运行目录下的settings.txt文件里设置。
总的来说,nvm-windows从网络上按照用户请求,下载对应版本的node程序,并将nodejs安装到root下“v+版本号”命名的目录中,借助path目录的symlink软链接(默认命名为nodejs),指向对应版本的nodejs,并通过修改path的symlink指向(实际上是删除在重建),在不同nodejs版本间切换。
三、我在使用中遇到的问题
因为平常需要用到Visual Studio写代码,所以也会安装上VS自带的nodejs工作负荷,这导致在安装nvm-windows的时候并不能识别这些“计划外”的nodejs版本(双击会提示nodejs不可用,如下图)。
又或者是自定义的nodejs安装为添加至环境变量,nvm-windows即使采用安装方式也未能正确识别,以及其它原因导致的能识别却未能移动到root下对应的版本目录等原因导致的现存nodejs版本“未纳入nvm管理版图”。
四、解决方法
参考了nvm软链接的思想,我在root目录下创建软链接,例如:
mklink /d "F:\nvm\v12.20.1" "C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\MSBuild\Microsoft\VisualStudio\NodeJs"
效果如下图:
这时,我们可以通过nvm use的方式切换node版本(注:VS安装的NodeJS默认32位,nvm会要求末尾加上32,才可切换。
nvm use v12.20.1 32
但美中不足之处是,采用nvm list语句并不能列出自己定义的软链接。
五、最后采用的办法
通过阅读该项目的代码(写这篇文章时,该软件版本为1.1.11,仓库地址:coreybutler/nvm-windows: A node.js version management utility for Windows. Ironically written in Go. (github.com)),发现当中node.go文件里未将symlink视作一个目录,原因是Go语言中isDir()函数对symlink返回False,中途曾用Python的isdir()函数测试,对symlink返回True,故修改这段代码,可以达到把symlink纳入“体制内”的目的。
func GetInstalled(root string) []string {
list := make([]semver.Version, 0)
files, _ := ioutil.ReadDir(root)
for i := len(files) - 1; i >= 0; i-- {
if files[i].IsDir() || (files[i].Mode()&os.ModeSymlink == os.ModeSymlink) {
isnode, _ := regexp.MatchString("v", files[i].Name())
if isnode {
currentVersionString := strings.Replace(files[i].Name(), "v", "", 1)
currentVersion, _ := semver.Make(currentVersionString)
list = append(list, currentVersion)
}
}
}
semver.Sort(list)
loggableList := make([]string, 0)
for _, version := range list {
loggableList = append(loggableList, "v"+version.String())
}
loggableList = reverseStringArray(loggableList)
return loggableList
}
修改后重新编译生成,并替换原来nvm.exe。
至此,nvm list能正确识别自定义的node指向。
修改后的代码和生成的程序如下(文章都写了,就当带货吧,代码仓库已按原nvm-windows项目发起人的要求,提交给他测试,就不发了,仅发我发在CSDN下载的这部分代码😄):
nvm-windows(symlink识别修改)源代码及应用程序资源-CSDN文库
原仓库代码已修改,可下载最新版代码更新这个功能。