首页 > 解决方案 > 如何在 gulp 任务中运行 shell 命令并检测它何时完成?

问题描述

我正在尝试使用在 gulp 任务中运行 shell 命令child_process.spawn

我必须检测任务何时完成运行,所以我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();
    }
  });
});

由于某种原因,我的 echo 语句没有发出,因此 if 语句没有被传递。

我哪里错了?

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

标签: javascriptnode.jsgulpchild-process

解决方案


Gulp和异步函数都child_process使用 Node 风格的错误优先回调。

spawn用于在命令执行期间处理流。如果只需要等到命令完成,exec然后execFile执行此操作:

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());
});

推荐阅读