gulp:连续执行多个命令

时间:2016-04-21 18:33:19

标签: node.js gulp imagemagick

我想使用gulp和imagemagick来批量调整图像大小。因为我无法找到imagemagick的当前gulp包装器,所以我决定在gulp中通过exec运行imagemagick。像这样:

gulp.task('images-large', function (cb) {
    exec('mogrify -path .\\images\\large -scale "1920x1080^" -gravity north -crop 1920x1080+0+0 .\\raw_images\\*.*', function (err, stdout, stderr) {
        console.log(stdout);
        console.log(stderr);
        cb(err);
    });
});

gulp.task('images-medium', function (cb) {
    exec('mogrify -path .\\images\\medium -scale "960x450^" -gravity north -crop 960x450+0+0 .\\raw_images\\*.*', function (err, stdout, stderr) {
        console.log(stdout);
        console.log(stderr);
        cb(err);
    });
});

上述两种情况都可以正常运行,单独运行时。各种尺寸的图像进入,均匀地回来。现在出现了问题。如果我结合两个类似的任务:

gulp.task('image', [
    'image-large',
    'image-medium'
]);

然后大型和中型图像都随机出现。我猜想imagemagick并不喜欢同时运行多个mogrify命令。也许是因为它实际上会暂时修改原始图像?这对我来说是一个谜。

而不是与imagemagick(通常是一个失败的命题)战斗,我宁愿只是连续,大,然后中等运行我的图像变换。有没有办法在gulp中运行串行exec()命令?也就是说,在运行下一个之前等待一个exec完成?

我试过这样的事情:

gulp.task('images-medium', ['images-large'], function (cb) {...});

可悲的是,图像仍然是随机大小的。

计划B是将imagemagick的东西移到节点脚本上,然后从gulp运行节点脚本,但这已经进入Rube Goldberg领域,我不确定它是不是我的最佳选择。

不太可能,我能做些什么让imagemagick表现出来?

2 个答案:

答案 0 :(得分:1)

尝试使用run-sequence。我对mogrify一无所知,但run-sequence将允许您将任务分组,但仍然按顺序/串行而不是并行运行。

答案 1 :(得分:-1)

有一个gulp包装器,它被称为gulp-gm。最糟糕的情况是,如果它不起作用,则有general wrapper for gm/im,比exec()更容易和更清洁。

使用示例gulp-gm:

var gulp = require('gulp');
var gm = require('gulp-gm');

gulp.task('default', function() {
  gulp.src('test.png')

  .pipe(gm(function(gmfile) {
    return gmfile.resize(100, 100);
  }, {
    imageMagick: true
  }))

  .pipe(gulp.dest('dist'));
});