Состояние галпа внутри трубы

22

Как я могу выполнить условие внутри канала Gulp для вывода в другое место назначения.

g.task('sass', function() {
  return g.src(sources.sass).pipe(changed(output.css)).pipe(sass({
    style: 'compressed',
    sourcemap: true
  })).pipe(function() {
    if (..) {
      g.dest(output.css);
    } else {
      g.dest(output.css2);
    }
  }).pipe(notify('scss converted to css and
compressed
<%=f ile.relative %>'));
});
    
задан max li 28.11.2014 в 05:04
источник
  • какие типы выражений вы хотели бы использовать? –  havenchyk 28.11.2014 в 13:32

4 ответа

33

Используйте плагин gulp-if :

var gulpif = require('gulp-if');

g.task('sass', function() {
    return g.src(sources.sass)
        .pipe(changed(output.css))
        .pipe(sass({style:'compressed', sourcemap:true}))

        // Conditional output
        .pipe(gulpif(condition1, g.dest(output.css)))
        .pipe(gulpif(condition2, g.dest(output.css2)))

        .pipe(notify('scss converted to css and compressed <%= file.relative %>'));
});
    
ответ дан Daniel Naab 29.11.2014 в 21:05
12

Решение без каких-либо новых зависимостей:

Функция gulp.src возвращает поток, поэтому вы можете его использовать;)
Посмотрите gulp docs .

gulp.task('task', function () {
  let stream = gulp.src(sources.sass)
    .pipe(changed(output.css)).pipe(sass({
      style: 'compressed',
      sourcemap: true
    }));

  if (2 + 2 === 4) {
    stream = stream
      .pipe(someModule())
      .pipe(someModule2());
  }

  else {
    stream = stream
      .pipe(someModule3())
      .pipe(someModule4());
  }

  stream = stream.pipe(notify('scss converted to css and compressed'));

  return stream;
});
    
ответ дан Niklavr 10.04.2017 в 20:21
  • Отличное решение без использования gulpif, который не работал на меня –  Tonio 01.02.2018 в 16:03
  • @Tonio, попробуйте использовать обновленную (по Маркусу) версию этого кода, если эта проблема по-прежнему актуальна. –  Niklavr 02.03.2018 в 15:43
4

Я предлагаю вам использовать выражение примерно так:

g.task('sass', function(){
  var destinationFileName;

  if (...) {
    destinationFileName = 'output.css';
  } else {
    destinationFileName = 'output2.css';
  }

  return g.src(sources.sass)
    .pipe(changed(output.css))
    .pipe(sass({style:'compressed', sourcemap:true}))
    .pipe(g.dest(destinationFileName))
    .pipe(notify('scss converted to css and compressed <%= file.relative %>'));
});
    
ответ дан havenchyk 28.11.2014 в 13:37
  • Мое условие было бы из source.sass, так как я могу это сделать? –  max li 28.11.2014 в 16:55
1

Если вы не хотите добавлять какую-либо дополнительную зависимость, вы можете доверять добрым старым Elvis (?:) :

g.task('sass', function() {
  return g.src(sources.sass)
    .pipe(changed(output.css))
    .pipe(sass({style:'compressed', sourcemap:true}))

    // Conditional output
    .pipe(condition ? g.dest(output.css) : g.dest(output.css2))

    .pipe(notify('scss converted to css and compressed <%= file.relative %>'));
});

Или для нескольких случаев:

.pipe(condition1 ? g.dest(output.css) : gulp.util.noop())
.pipe(condition2 ? g.dest(output2.css) : gulp.util.noop())
    
ответ дан s.alem 12.07.2017 в 17:19
  • Я получаю эту ошибку: gulp.util.noop не существует –  Arashsoft 21.03.2018 в 21:16