【发布时间】:2021-08-27 04:08:01
【问题描述】:
我正在尝试在我的 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 doesn't emit any events 哪种匹配我的 ripgrep 不工作的用例。但目前还不清楚究竟做了什么来解决这个问题。向社区寻求帮助。
为了重现这一点,请用上面的代码创建 index.js 并以 node index.js 的节点运行
【问题讨论】:
-
如果 ripgrep 检测到标准输入并且您没有提供任何搜索路径,那么 ripgrep 将尝试搜索标准输入。很可能您使用的任何 Node 东西都将一些东西附加到标准输入,这使得它看起来像是有一些东西可以搜索。所以 ripgrep 就是这样做的,因为那里实际上没有任何东西,它只是永远挂起等待。这就是
rg foo ./起作用的原因:因为您为其提供了搜索路径。底线,要么使用rg foo ./(为什么这对你不起作用?)或者告诉Node不要产生一个附加了标准输入的进程。 -
@BurntSushi5 非常感谢您的回复。我将 cwd 作为 ./ 传递,绝对路径,但仍然没有成功。但是我能够分离正在工作的标准输入 stdio: ['ignore', 'pipe', 'pipe'] 我有点想知道如何通过传递我认为我正在传递的 cwd 来解决这个问题(如果我没有遗漏任何东西)。至少暂时我有一些可以依靠的东西,谢谢你。
-
这看起来很相关:github.com/BurntSushi/ripgrep/discussions/1979 FWIW,“通过 CWD”对我来说是模棱两可的。我不知道您的意思是在节点进程级别设置 CWD,还是实际上在运行
rg foo ./。如果是后者,那么它应该可以工作,目前还不清楚为什么它不会。为了让我诊断它,我需要一个完整的复制品,包括告诉我如何运行它(如果它来自 Node)。 -
@BurntSushi5 更新问题以重现此问题。至少到目前为止,我能够通过将一个参数更新为 { cwd: './', stdio: ['ignore', 'pipe', 'pipe'] } 基本上忽略标准输入来解决此错误。如果您想重现并查看 ./ 如何解决问题,那就太好了。否则我可以发布现在有效的答案。
-
感谢转载。当我通过
./时,它工作得很好。我所做的只是将['test']更改为['test', './']。
标签: node.js vscode-extensions child-process ripgrep