如何在gulp任务中运行一个shell命令并检测其完成?

4
我正在尝试使用child_process.spawn在gulp任务中运行shell命令。我需要检测任务何时完成,所以我使用stdout来检查特定的字符串,该字符串在命令结束时被发出,但出于某种原因,它似乎没有被发出:
// gulp 3.9.1
var gulp = require('gulp');
var spawn = require('child_process').spawn;

gulp.task('my-task', function(cb) {
  var command = ''; // construct my shell command here
  var end = 'end_of_command';
  var command = command + '; echo ' + end; // add special string to look for

  var cmd = spawn(command, { shell: true });

  cmd.stdout.on('data', function(data) {
    if (data.includes(end)) {
      return cb();
    }
  });
});

由于某些原因,我的回声语句没有发出,因此if语句没有被通过。

我错在哪里了?

我还应该注意的是,当我直接在我的shell中运行这个命令而不是通过gulp任务运行时,它可以正常运行,并且预期的输出是可见的。


你是故意这样做的吗?因为等待 end_of_command 输出真的是一个很奇怪的方式。 - Estus Flask
由于某些原因,我找不到我参考这个想法的问题,该问题的解决方案是查找“结束字符串”。有没有更好的方法来检测gulp任务中shell命令的结束/退出? - Timothy Fisher
你没有在命令执行方面找到任何信息,因为这个问题并不特定于Gulp。 - Estus Flask
1个回答

4

无论是Gulp还是child_process异步函数都会使用Node-style error-first回调。

spawn适用于在命令执行期间处理流。 如果只需要等待命令完成,execexecFile就可以实现:

var gulp = require('gulp');
var exec = require('child_process').exec;

gulp.task('my-task', function(cb) {
  exec('cmd', cb);
});

spawn 的使用可能会更加复杂,因为它还允许处理退出码:

var gulp = require('gulp');
var spawn = require('child_process').spawn;

gulp.task('my-task', function(cb) {
  spawn('cmd', [], {})
  .on('error', cb)
  .on('close', code => code ? cb(new Error(code)) : cb());
});

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接