V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
s1mp
V2EX  ›  Node.js

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

  •  
  •   s1mp · 310 天前 · 1769 次点击
    这是一个创建于 310 天前的主题,其中的信息可能已经有所发展或是发生改变。

    各位大佬,请教一个问题,我想在 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
    }
    

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

    16 条回复    2024-02-18 14:19:31 +08:00
    FlytoSirius
        1
    FlytoSirius  
       310 天前
    啥时代了, 别再 xxx for Windows 了, 开发还是 on WSL 吧.
    除非, 客户部署环境就是 on Windows.

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

    nvm 不是 nodejs 的版本管理 cli 吗,看你的需要是想在 js 里执行命令,无非就是 child_process 。
    - exec 可以指定 shell 环境,cmd 或者 ps 都行,要读输出懒得说了看文档吧
    - spawn 直接运行程序,可以无需 shell 。nvm 应该是脚本吧,.sh/.bat 之类的,如果是 c 编译成的.exe 程序倒也可以。spawn 貌似也可以指定 shell ,看文档
    - fork 用不多不熟,貌似对 ipc 有用
    s1mp
        16
    s1mp  
    OP
       308 天前
    @n18255447846 是的没错,但是因为 nvm 加了终端判断所以试了 exec 指定 cmd 或者 shell 也不行,上面回答的 spawn('nvm', ['version'], { stdio: 'inherit' }); 是可行的
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1397 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 16:55 · PVG 00:55 · LAX 08:55 · JFK 11:55
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.