0

我正在尝试在我的 mac 机器上运行的 node.js 应用程序中使用 ripgrep。(VS代码扩展)。

我尝试了 ripgrep-js npm libray 但它没有给出任何响应,并且应用程序只是处于挂起状态。

我尝试调试,发现 ripgrep-js 只是运行 rg 命令并获取其结果并以格式化的方式返回。我尝试运行简单的命令,例如

rg test .

我得到了结果。

但是当我通过 node.js child_process 运行时,它没有给出任何响应。这是我正在运行的代码。

// index.js
const cp = require('child_process');


let p = cp.spawn('rg', ['test'], { cwd: './'});
p.stdout.on('data', data => {
    console.log('stdout: ' + data.toString());
});

p.stderr.on('data', data => {
    console.log('stderr: ' + data.toString());
});

p.on('close', code => {
    console.log('closed: ' + code);
});

不知道可能是什么原因。我遇到了这个问题child_process.spawn 不会发出任何 与我的 ripgrep 不工作的用例匹配的事件。但目前还不清楚究竟做了什么来解决这个问题。向社区寻求帮助。

为了重现这一点,请使用上面的代码创建 index.js 并使用节点运行node index.js

4

1 回答 1

1

感谢@BurntSushi5 帮助解决了这个问题。总而言之,我们有两种选择来解决这个问题。

解决方案 1:忽略标准输入

    const cp = require('child_process');
    let p = cp.spawn('rg', ['test'], { cwd: './'
    ,stdio: ['ignore', 'pipe', 'pipe']
    });
    p.stdout.on('data', data => {
        console.log('stdout: ' + data.toString());
    });

    p.stderr.on('data', data => {
        console.log('stderr: ' + data.toString());
    });

    p.on('close', code => {
        console.log('closed: ' + code);
    }); 

解决方案 2:通过 ./

    const cp = require('child_process');
    let p = cp.spawn('rg', ['test','./'], { cwd: '.'});
    p.stdout.on('data', data => {
        console.log('stdout: ' + data.toString());
    });

    p.stderr.on('data', data => {
        console.log('stderr: ' + data.toString());
    });

    p.on('close', code => {
        console.log('closed: ' + code);
    }); 
于 2021-09-01T17:43:00.633 回答