请教一个在 nodejs 下模拟终端环境运行一些仅在终端下运行的指令问题

2024-02-16 01:22:06 +08:00
s1mp  s1mp

各位大佬,请教一个问题,我想在 nodejs 环境下运行 nvm for windows 的指令,但是在 nvm 最近更新的版本里,发现新增了终端检测代码:

if !isTerminal() {
		alert("NVM for Windows should be run from a terminal such as CMD or PowerShell.", "Terminal Only")
		os.Exit(0)
	}

	// Capture any additional arguments
	if len(args) > 2 {
		detail = args[2]
@@ -180,6 +185,102 @@ func setNpmMirror(uri string) {
	saveSettings()
}

func isTerminal() bool {
	fileInfo, err := os.Stdout.Stat()
	if err != nil {
		return false
	}
	return (fileInfo.Mode() & os.ModeCharDevice) != 0
}

请问我可以绕开这个检测吗

1903 次点击
所在节点   Node.js  Node.js
16 条回复
FlytoSirius
FlytoSirius
2024-02-16 01:31:12 +08:00
啥时代了, 别再 xxx for Windows 了, 开发还是 on WSL 吧.
除非, 客户部署环境就是 on Windows.

抱歉, 没帮你直接解决问题...
ysc3839
ysc3839
2024-02-16 06:57:33 +08:00
67373net
67373net
2024-02-16 16:39:49 +08:00
const { spawn } = require('child_process');
let child = spawn('nvm', ['version'], { stdio: 'inherit' });
s1mp
s1mp
2024-02-16 20:49:29 +08:00
@67373net 好的大佬,我今晚试试,感谢回复
s1mp
s1mp
2024-02-16 20:50:59 +08:00
@FlytoSirius 场景需要没办法要照顾到 win 的用户
s1mp
s1mp
2024-02-16 20:51:26 +08:00
@ysc3839 一会试试,感谢大佬回复
julyclyde
julyclyde
2024-02-16 22:29:39 +08:00
你需要做一个 pty 来运行它
但是还是建议绕过它,直接去干它在干的事
s1mp
s1mp
2024-02-17 01:15:57 +08:00
@67373net 大佬 你这个方法是可行的,但我使用 spawn 或者 spawnSync 好像都无法获得执行指令后控制台的输出,这个问题可以解决吗
67373net
67373net
2024-02-17 03:21:30 +08:00
@s1mp 我不是大佬哈,我也是个菜鸟,好多都是问 AI 的。
根据我的理解,这个输出一旦继承到终端了,就没办法再捕获了。
有个思路不确定可不可行,就是用第三方的工具去劫持终端的输出到一个文件里面,再读取文件的内容,不过这样就很绕了,可以参考下楼上的一些方法~
wingzhingling
wingzhingling
2024-02-17 08:56:29 +08:00
这是要实现自动化切换 node 版本?
s1mp
s1mp
2024-02-17 11:32:48 +08:00
s1mp
s1mp
2024-02-17 11:35:26 +08:00
@67373net 好的好的 我在研究一下 谢谢哈
chitaotao
chitaotao
2024-02-17 21:39:35 +08:00
模拟终端环境就是 pty ,nodejs 下好像有 node-pty 在 windows 下可用
但是似乎有个未解决的 bug [Unable to kill pty process on Windows]( https://github.com/microsoft/node-pty/issues/437) 导致运行完成后 node 不会自动退出
xling
xling
2024-02-18 08:22:51 +08:00
可以试试这个 volta
n18255447846
2024-02-18 12:57:08 +08:00
指令 or 命令?

nvm 不是 nodejs 的版本管理 cli 吗,看你的需要是想在 js 里执行命令,无非就是 child_process 。
- exec 可以指定 shell 环境,cmd 或者 ps 都行,要读输出懒得说了看文档吧
- spawn 直接运行程序,可以无需 shell 。nvm 应该是脚本吧,.sh/.bat 之类的,如果是 c 编译成的.exe 程序倒也可以。spawn 貌似也可以指定 shell ,看文档
- fork 用不多不熟,貌似对 ipc 有用
s1mp
2024-02-18 14:19:31 +08:00
@n18255447846 是的没错,但是因为 nvm 加了终端判断所以试了 exec 指定 cmd 或者 shell 也不行,上面回答的 spawn('nvm', ['version'], { stdio: 'inherit' }); 是可行的

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1015789

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX