管道处理以在Node.js子进程中提取tar缓冲区

时间:2013-03-26 14:09:00

标签: node.js pipe child-process

我想通过Node.js执行此操作:

git archive remote=git@example.com:repo.git HEAD | tar -x - -C /path/to/extracted/

所以,我编写了类似的代码:

git = spawn 'git', ['archive', "--remote=git@example.com:repo.git", 'HEAD']
tar = spawn 'tar', ['-x', '-', '-C /path/to/extracted']

git.stderr.on 'data', (data) ->
  console.log "git error: #{data}"

git.stdout.on 'data', (data) ->
  tar.stdin.write data

tar.stderr.on 'data', (data) ->
  console.log "tar error: #{data}"

git.on 'exit', (code) ->
  console.log "git process done with code #{code}"

tar.on 'exit', (code) ->
  console.log "tar process done with code #{code}"

然而,这并不像我预期的那样有效。我应该更改什么才能使其正常工作?

提前致谢。

更新

--x

之间,正确的命令实际上不需要-C
git archive remote=git@example.com:repo.git HEAD | tar -x -C /path/to/extracted/

2 个答案:

答案 0 :(得分:0)

在这种情况下,你应该使用函数exec而不是spawn。如exec文档中所示,它接受管道exec documentation

exec('git archive remote=git@example.com:repo.git HEAD | tar -x - -C /path/to/extracted/', function (error, stdout, stderr) {
    // logic here
}

答案 1 :(得分:0)

使用child_process.exec时应注意命令注入。您可以使用可以应用于流的.pipe来实现与spawn类似的行为(这是spawn使用的)。 https://nodejs.org/api/stream.html#stream_event_pipe