在作为生成节点进程启动时显示来自GIt的反馈

时间:2014-02-02 00:30:20

标签: node.js git yeoman-generator

我正在尝试通过创建一个新的yeoman生成器为新项目设置锅炉板,我需要做的一件事就是将一个大型Git存储库设置为子模块,然后在某个标签处检出。我有一切工作,但我想提供一些关于结账的进展反馈。

当您手动运行submodule add时,您会更新如下:

Receiving objects:  14% (22925/163744), 5.41 MiB | 1.30 MiB/s

我希望在我的节点脚本子模块添加期间显示该输出,但我似乎无法让它显示任何内容。这就是我所拥有的:

MyGenerator.prototype.addSubmodule = function() {
  var done = this.async();

  console.log('Initializing submodule. This may take a minute.');

  var git = spawn('git', ['submodule', 'add', 'git://github.com/PathTo/Submodule.git', 'submodule']);$

  git.stdout.on('data', function(data){
    console.log(data);
  });

  git.stderr.on('data', function(data){
    console.log(data);
  });

  git.on('close', function(){$
    process.chdir('submodule');$

    console.log('Checking out %s branch of Submodule', this.submoduleVersion);

    var checkout = spawn('git', ['checkout', this.submoduleVersion]);

    checkout.stdout.on('data', function(data) {
      console.log(data);
    });

    checkout.on('close', function() {
      process.chdir('../');
      done();
    });

  });

提前感谢。

2 个答案:

答案 0 :(得分:1)

这与Running shell script in rails only outputs the 1 line有关,但似乎--progress所描述的git submodule选项不受var git = spawn( 'git', ['submodule', 'add', 'git://github.com/PathTo/Submodule.git', 'submodule'], { stdio: ['pipe', process.stdout, process.stderr] ); 支持。您应该能够通过让Git进程从当前进程继承stderr文件描述符(可能同时在stdout中抛出)来获得所需的进度输出,根据child_process documentation可以像这样:

{{1}}

答案 1 :(得分:0)

如果您的代码是在shell上运行的,那么我相信使用{ stdio: 'inherit'}会修复它:

var git = spawn('git', ['submodule', 'add', 
                        'git://github.com/PathTo/Submodule.git', 'submodule'], 
                { stdio: 'inherit' });

说明:通过bash shell中的测试,我发现如果git认为它没有与tty通信,它就不会输出任何进度信息。如果您的软件是从shell运行的,并告诉spawn只是将stdinstdoutstderr传递给子进程,那么孩子应该看到tty和输出进度信息。