Как я могу проверить, запущена ли задача как зависимость от другой задачи в gulp @ 4? - PullRequest
0 голосов
/ 09 ноября 2018

Я использую gulp-notify для запуска уведомлений, когда задачи завершены. Если задача запускается автономно, запускается уведомление для этой конкретной задачи. Если задача запускается как зависимость другой задачи, запускается уведомление для всех зависимостей.

В gulp @ 3 я проверяю, вызывается ли задача как зависимость, используя gulp.seq, который содержит массив запускаемых задач. Допустим, у меня есть три задачи: default, styles и scripts, с двумя последними, установленными в качестве зависимостей первой. При запуске gulp styles, gulp.seq будет содержать [ 'styles' ]. При запуске gulp (задача по умолчанию), gulp.seq будет содержать [ 'styles', 'scripts', 'default' ]. Зная это, я затем проверяю gulp.seq.indexOf("styles") > gulp.seq.indexOf("default"), который сообщает мне погоду или нет styles был выполнен как часть задачи default.

При gulp @ 4 кажется, что gulp.seq больше не существует. Я попытался копаться в документации и исходном коде без удачи. Кажется, что gulp.tree({ deep:true }) ( docs ) может быть тем, что я ищу, но я не вижу в нем ничего, что возвращало бы что-нибудь полезное.

Есть ли эквивалент gulp.seq в глотке @ 4?

Ответы [ 2 ]

0 голосов
/ 14 ноября 2018

Через некоторое время я обнаружил, что это возможно с помощью модуля yargs , который я уже установил.

Например, при запуске gulp styles я могу проверить argv._.indexOf("styles") > -1, так как он содержит ['styles']. При запуске gulp (т.е. задание по умолчанию) оно содержит []. В моем тестировании это прекрасно работает для моего варианта использования.

0 голосов
/ 13 ноября 2018

API gulp.seq никогда не был официальным prop, предоставляемым Gulp. С Gulp 4 вы не можете этого сделать. gulp.tree({ /* */ }) не решит эту проблему для вас.

Сказав, что, если вам все еще нужно выяснить, выполнялась ли задача во время конвейера какой-либо другой задачи, вам придется украсить каждую задачу gulp вашей собственной оберткой, используя что-то вроде этого:

let runTasks = [];

function taskWrapper(taskName, tasks, thisTask) {

    let callbackTask;

    function innerCallback(cb) {
        runTasks.push(taskName);
        cb();
    }

    if (thisTask) {
        callbackTask = function(cb) {
            thisTask(function () {
                innerCallback(cb);
            });
        }
    } else {
        callbackTask = innerCallback;
    }

    const newTasks = [ ...tasks, callbackTask ];

    gulp.task(taskName, gulp.series(newTasks));
}

// INSTEAD OF THIS
// gulp.task('default', gulp.series('style', 'script', function () { }));

// DO THIS
taskWrapper('default', ['style', 'script'], function(cb) {
    console.log('default task starting');
    cb();
});

ПРИМЕЧАНИЕ. Вышеуказанные фрагменты кода имеют ограничения. Если вы используете режим наблюдения, массив, поддерживающий выполненные задачи, т.е. runTasks будет продолжать расти. Кроме того, предполагает, что задачи всегда будут выполняться последовательно. В параллельном режиме логика немного усложняется.

Наконец, у вас также может быть задача predefault, чтобы помочь ей в дальнейшем:

taskWrapper('predefault', [], function(cb) {
    // RESET runTasks
    runTasks = [];
    cb();
});

taskWrapper('default', ['predefault', 'style', 'script'], function(cb) {
    console.log('default task starting');
    cb();
});

Также я сомневаюсь, что gulp-notify будет работать с Gulp 4.

...