NVM-Windows管理由Visual Studio安装或自定义的Node和NPM

一、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文库

原仓库代码已修改,可下载最新版代码更新这个功能。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Humbunklung

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值