Реорганизованная задача просмотра с использованием gulp v4 не работает - PullRequest
0 голосов
/ 02 января 2019

Я выполняю рефакторинг своего gulpfile, теперь я использую gulp v4, и у меня возникла проблема с gulp watch, где не работает моя функция stylesCompileIncremental. Любая помощь или указатели будут высоко оценены.

Мой рефакторинг включает в себя:

  • Переключение на использование функций вместо gulp.task
  • Использование series и parallel согласно документам
  • Экспорт общедоступных задач внизу моего gulpfile, т.е. exports.stylesWatch = stylesWatch;
  • Добавление обратных вызовов в функции, чтобы сообщить Gulp, что функция завершена

Код для затронутых задач следующий (пути к каталогам хранятся в файле package.json, следовательно, pathConfig.ui ... values):

// Compile only particular Sass file that has import of changed file
function stylesCompileIncremental(cb) {
    sassCompile({
        source: getResultedFilesList(changedFilePath),
        dest: pathConfig.ui.core.sass.dest,
        alsoSearchIn: [pathConfig.ui.lib.resources]
    });
    cb();
}

// Compile all Sass files and watch for changes
function stylesWatch(cb) {
    createImportsGraph();
    var watcher = gulp.watch(pathConfig.ui.core.sass.src + '**/*.scss', gulp.parallel(devServReloadStyles));
    watcher.on('change', function(event) {
        changedFilePath = event;
    });
    cb();
}

// reload css separated into own function. No callback needed as returning event stream
function reloadCss() {
    return gulp.src(generateFilePath)
        .pipe($.connect.reload()); // css only reload
}

function devServReloadStyles(cb) {
    gulp.series(stylesCompileIncremental, reloadCss);
    cb();
}

Когда я запускаю gulp stylesWatch с использованием своего рефакторингового кода, я получаю следующий вывод (обратите внимание, что задача stylesCompileIncremental не запускается):

Refactored output

Итак, работа с часами успешно запущена, но что-то не так, когда devServReloadStyles запущен, чтобы функция stylesCompileIncremental не сработала.

Исходный код перед рефакторингом (при использовании gulp v3) приведен ниже:

// Compile only particular Sass file that has import of changed file
gulp.task('styles:compile:incremental', () => {
    return sassCompile({
        source: getResultedFilesList(changedFilePath),
        dest: pathConfig.ui.core.sass.dest,
        alsoSearchIn: [pathConfig.ui.lib.resources]
    });
});

// Compile all Sass files and watch for changes
gulp.task('styles:watch', () => {
    createImportsGraph();
    gulp.watch(
        pathConfig.ui.core.sass.src + '**/*.scss',
        ['devServ:reload:styles']
    ).on('change', event => changedFilePath = event.path);
});

// Reload the CSS links right after 'styles:compile:incremental' task is returned
gulp.task('devServ:reload:styles', ['styles:compile:incremental'], () => {
    return gulp.src(generateFilePath) // css only reload
        .pipe($.connect.reload());
});

Исходный вывод задачи при запуске styles:watch такой:

Original output

И это переменная sassCompile, используемая внутри stylesCompileIncremental, которую я пока не изменил.

    /**
* Configurable Sass compilation
* @param {Object} config
*/
const sassCompile = config => {
    const sass = require('gulp-sass');
    const postcss = require('gulp-postcss');
    const autoprefixer = require('autoprefixer');

    const postProcessors = [
        autoprefixer({
            flexbox: 'no-2009'
        })
    ];

    return gulp.src(config.source)
        .pipe($.sourcemaps.init({
            loadMaps: true,
            largeFile: true
        }))
        .pipe(sass({
            includePaths: config.alsoSearchIn,
            sourceMap: false,
            outputStyle: 'compressed',
            indentType: 'tab',
            indentWidth: '1',
            linefeed: 'lf',
            precision: 10,
            errLogToConsole: true
        }))
        .on('error', function (error) {
            $.util.log('\x07');
            $.util.log(error.message);
            this.emit('end');
        })
        .pipe(postcss(postProcessors))
        .pipe($.sourcemaps.write('.'))
        .pipe(gulp.dest(config.dest));
};

UPDATE

Это связано с проблемой с моей функцией devServReloadStyles, хотя я до сих пор не знаю, почему. Если я изменю свою функцию stylesWatch на использование оригинальной задачи devServ:reload:styles, то запускается stylesCompileIncremental.

// Compile all Sass files and watch for changes
function stylesWatch(cb) {
    createImportsGraph();
    var watcher = gulp.watch(pathConfig.ui.core.sass.src + '**/*.scss', gulp.parallel('devServ:reload:styles'));
    watcher.on('change', function(event) {
        changedFilePath = event;
    });
    cb();
}

Было бы хорошо не использовать старое задание и использовать его как функцию. Кто-нибудь может сказать мне, почему моя измененная версия не работает, и есть предложения относительно того, как это должно выглядеть?

1 Ответ

0 голосов
/ 03 января 2019

Я исправил это сейчас.gulp.series и gulp.parallel возвращают функции, поэтому не было необходимости заключать stylesCompileIncremental и reloadCss в другую функцию, т.е.devServReloadStyles.Согласно комментарию Блейна здесь .

Итак, моя функция:

function devServReloadStyles(cb) {
    gulp.series(stylesCompileIncremental, reloadCss);
cb();

}

Может быть просто присвоена переменной:

const devServReloadStyles = gulp.series(stylesCompileIncremental, reloadCss);

И моя задача stylesWatch уже вызывает devServReloadStyles:

// Compile all Sass files and watch for changes
function stylesWatch(cb) {
    createImportsGraph();
    var watcher = gulp.watch(pathConfig.ui.core.sass.src + '**/*.scss', gulp.parallel(devServReloadStyles));
    watcher.on('change', function(event) {
        changedFilePath = event;
    });
    cb();
}

Таким образом, при запуске gulp stylesWatch теперь выполняется задание stylesCompileIncremental (обратите внимание, что devServReloadStyles не отображается, поскольку это не функция).

enter image description here

...