Как подключиться к другой задаче в Gulp?

Я пытаюсь высушить свой gulpfile. Там у меня есть небольшое дублирование кода, которое мне не нравится. Как это можно сделать лучше?

gulp.task('scripts', function() {
  return gulp.src('src/scripts/**/*.coffee')
    .pipe(coffeelint())
    .pipe(coffeelint.reporter())
    .pipe(coffee())
    .pipe(gulp.dest('dist/scripts/'))
    .pipe(gulp.src('src/index.html'))  // this
    .pipe(includeSource())             // needs
    .pipe(gulp.dest('dist/'))          // DRY
});

gulp.task('index', function() {
  return gulp.src('src/index.html')
    .pipe(includeSource())
    .pipe(gulp.dest('dist/'))
});

Я получил index отдельным заданием, так как мне нужно смотреть src/index.html, чтобы livereload. Но я также слежу за своими .coffee источниками, и когда они меняются, мне нужно обновить и src/index.html.

Как я могу подключиться к index в scripts?


person srigi    schedule 04.05.2014    source источник
comment
Возможный дубликат Как запускать задачи Gulp синхронно/один за другим другой   -  person falsarella    schedule 15.03.2016


Ответы (2)


gulp позволяет упорядочить серию задач на основе аргументов.

Пример:

gulp.task('second', ['first'], function() {
   // this occurs after 'first' finishes
});

Попробуйте следующий код, вы будете запускать «индекс» задачи для запуска обеих задач:

gulp.task('scripts', function() {
  return gulp.src('src/scripts/**/*.coffee')
    .pipe(coffeelint())
    .pipe(coffeelint.reporter())
    .pipe(coffee())
    .pipe(gulp.dest('dist/scripts/'));
});

gulp.task('index', ['scripts'], function() {
  return gulp.src('src/index.html')
    .pipe(includeSource())
    .pipe(gulp.dest('dist/'))
});

Задача index теперь потребует завершения scripts перед запуском кода внутри своей функции.

person SteveLacy    schedule 06.05.2014
comment
Я попробую этот подход, как только смогу. - person srigi; 09.06.2014
comment
а если scripts запустится, а index нужно запустить сразу после scripts? - person vsync; 17.01.2016
comment
Я предпочитаю использовать run-sequence для организации своих задач, так что в целом это решение правильное - выделить повторяющееся задание в собственный gulp.task. - person srigi; 25.02.2016
comment
@vsync, тогда вы создадите задачу, которая вызывает индекс так же, как индекс вызывает скрипты. он будет очень хорошо сочетаться, так что вы можете вызвать только одну задачу из консоли. в этом случае "индекс глотка" - person Zanven; 17.03.2016
comment
Сохранить поток на диск, чтобы загрузить его в другой задаче? Этот паттерн выглядит гораздо более ворчливым, чем глотательным. - person Gerardo Lima; 14.10.2016
comment
Это 100% не работает. Я получаю следующую ошибку AssertionError: Task function must be specified - person Bjorn; 30.12.2016
comment
Насколько я понимаю и проверял, gulp просто проверяет, что [index] начинается после [scripts], а не то, что [scripts] закончил глотание. Итак, в случае: gulp.task('2',['1'], function() { whatever() }); Gulp запустит 1, и сразу после запуска 1 он запустит 2. Runsequence лучше исправить это или даже проверить, действительно ли 1 закончился, и только затем запустить 2. Или как @gerardo-lima сказал, немного ворчливый путь. - person Billeeb; 12.09.2017

Если вы посмотрите на исходный код Orchestrator, особенно на реализацию .start(), вы увидите, что если последний параметр является функцией, он будет обрабатывать его как обратный вызов.

Я написал этот фрагмент для своих собственных задач:

  gulp.task( 'task1', () => console.log(a) )
  gulp.task( 'task2', () => console.log(a) )
  gulp.task( 'task3', () => console.log(a) )
  gulp.task( 'task4', () => console.log(a) )
  gulp.task( 'task5', () => console.log(a) )

  function runSequential( tasks ) {
    if( !tasks || tasks.length <= 0 ) return;

    const task = tasks[0];
    gulp.start( task, () => {
        console.log( `${task} finished` );
        runSequential( tasks.slice(1) );
    } );
  }
  gulp.task( "run-all", () => runSequential([ "task1", "task2", "task3", "task4", "task5" ));
person Assaf Moldavsky    schedule 24.05.2017