Running a shell command from gulp

I would like to run a shell command from gulp, using gulp-shell. I see the following idiom being used the gulpfile.

Is this the idiomatic way to run a command from a gulp task?

var cmd = 'ls';
gulp.src('', {read: false})
    .pipe(shell(cmd, {quiet: true}))
    .on('error', function (err) {
       gutil.log(err);
});

gulp-shell has been blacklisted. You should use gulp-exec instead, which has also a better documentation.

For your case it actually states:

Note: If you just want to run a command, just run the command, don't use this plugin:

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

gulp.task('task', function (cb) {
  exec('ping localhost', function (err, stdout, stderr) {
    console.log(stdout);
    console.log(stderr);
    cb(err);
  });
})

The new way to do this that keeps console output the same (e.g., with colors):

see: https://nodejs.org/api/child_process.html#child_process_child_process_spawn_command_args_options

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

gulp.task('my-task', function (cb) {
  var cmd = spawn('cmd', ['arg1', 'agr2'], {stdio: 'inherit'});
  cmd.on('close', function (code) {
    console.log('my-task exited with code ' + code);
    cb(code);
  });
});

With gulp 4 your tasks can directly return a child process to signal task completion:

'use strict';

var cp = require('child_process');
var gulp = require('gulp');

gulp.task('reset', function() {
  return cp.execFile('git checkout -- .');
});

gulp-v4-running-shell-commands.md


You could simply do this:

const { spawn } = require('child_process');
const gulp = require('gulp');

gulp.task('list', function() {
    const cmd = spawn('ls');
    cmd.stdout.on('data', (data) => {
        console.log(`stdout: ${data}`);
    });
    return cmd;
});

According to Gulp's documentation, you can run a command like echo like this:

const cp = require('child_process');

function childProcessTask() {
  return cp.exec('echo *.js');
}

exports.default = childProcessTask;

exec takes one string that will be parsed by the shell, and it silences output by default.

I personally like using child_process.spawn instead. spawn takes the name of the command, and then a list of arguments. If you use the option stdio: 'inherit' it won't swallow its output.

function childProcessTask() {
  return cp.spawn('echo', ['one', 'two'], {stdio: 'inherit'});
}

References:

  • Gulp documentation: Returning a child process
  • Node documentation: child_process.exec(command, options, callback)
  • Node documentation: child_process.spawn(command, args, options)