Подтвердить что ты не робот

Выполнить код после gulp задачи, выполняемой со всеми файлами

Итак, я пробовал Gulp, чтобы посмотреть, как он сравнивается с Grunt по скорости, и я очень впечатлен результатами, но у меня есть одна вещь, которую я не знаю, как это сделать в Gulp.

Итак, у меня есть эта задача Gulp для минимизации HTML:

gulp.task('html-minify', function() {
  var files = [
    relativePaths.webPath + '/*.html',
    relativePaths.webPath + '/components/**/*.html',
    relativePaths.webPath + '/' + relativePaths.appPath + '/components/**/*.html'
  ];

  var changedFiles = buildMetaData.getChangedFiles(files);

  //TODO: needs to execute only after successful run of the task
  buildMetaData.addBuildMetaDataFiles(changedFiles);
  buildMetaData.writeFile();
  return gulp.src(changedFiles, {
      base: relativePaths.webPath
    })
    .pipe(filelog())
    .pipe(minifyHtml({
      empty: true,
      quotes: true,
      conditionals: true,
      comments: true
    }))
    .pipe(gulp.dest(relativePaths.webPath + '/' + relativePaths.appPath +  '/' + relativePaths.buildPath));
});

У объекта buildMetaData есть настраиваемые функции, которые мне нужны, и почему я не могу использовать плагины типа gulp -changed. Я пытаюсь выяснить, как (если возможно) запустить блок кода после выполнения minify обрабатывать все файлы и успешно запускать. Возможно ли это с помощью gulp?

4b9b3361

Ответ 1

Вы можете просто выполнить задачу, которая зависит от html-minify:

gulp.task('other-task', ['html-minify'], function() {
  //stuff
});

Вы также можете прослушать событие stream end внутри задачи html-minify:

gulp.task('html-minify', function(done) {
  var files = [
    relativePaths.webPath + '/*.html',
    relativePaths.webPath + '/components/**/*.html',
    relativePaths.webPath + '/' + relativePaths.appPath + '/components/**/*.html'
  ];

  var changedFiles = buildMetaData.getChangedFiles(files);

  //TODO: needs to execute only after successful run of the task
  buildMetaData.addBuildMetaDataFiles(changedFiles);
  buildMetaData.writeFile();
  var stream = gulp.src(changedFiles, {
      base: relativePaths.webPath
    })
    .pipe(filelog())
    .pipe(minifyHtml({
      empty: true,
      quotes: true,
      conditionals: true,
      comments: true
    }))
    .pipe(gulp.dest(relativePaths.webPath + '/' + relativePaths.appPath +  '/' + relativePaths.buildPath));

  stream.on('end', function() {
    //run some code here
    done();
  });
  stream.on('error', function(err) {
    done(err);
  });
});

Ответ 2

Вы также можете объединить два потока с помощью event-stream. В этом примере вводится ввод из командной строки с yargs, создается конфиг, а затем объединяется два:

var enviroment = argv.env || 'development';
gulp('build', function () {
    var config = gulp.src('config/' + enviroment + '.json')
      .on('end', function() { gutil.log(warn('Configured ' + enviroment + ' enviroment.')); })
      .pipe(ngConstant({name: 'app.config'}));
    var scripts = gulp.src('js/*');
    return es.merge(config, scripts)
      .pipe(concat('app.js'))
      .pipe(gulp.dest('app/dist'))
      .on('error', function() { });
  });

Как и стандарт перед задачами, вы также можете дождаться завершения предыдущей задачи. Это полезно, когда вам нужно передать аргументы перед задачей (которой gulp в настоящее время не поддерживает):

var tasks = {
  before: function(arg){
    // do stuff
  },
  build: function() { 
    tasks.before(arg).on('end', function(){ console.log('do stuff') });
  }
};

gulp('build', tasks.build);