Как мне переписать этот gulpfile.js в gulp версии 4.0 - PullRequest
2 голосов
/ 29 марта 2019

Моя цель - автоматически выдвигать файлы при редактировании с помощью gulp, выполняя "clasp push" на терминале от моего имени.

Я получил эту ошибку, когда написал следующее в gulpfile.js

const gulp = require("gulp");
const exec = require("child_process");

gulp.task('push', function () {
    exec("clasp push")
});

gulp.task('watch', function () {
    gulp.watch([
        '**/* .js',
        "**/* .html"
    ], ['push'])
});

gulp.task('default', ['watch']);

Ошибка:

Task function must be specified
    at Gulp.set [as _setTask] (/Users/micklo/Desktop/AppsScriptProjects/AppsScriptAppName/node_modules/undertaker/lib/set-task.js:10:3)
    at Gulp.task (/Users/micklo/Desktop/AppsScriptProjects/AppsScriptAppName/node_modules/undertaker/lib/task.js:13:8)
    at Object.<anonymous> (/Users/micklo/Desktop/AppsScriptProjects/AppsScriptAppName/gulpfile.js:15:6)
    at Module._compile (internal/modules/cjs/loader.js:701:30)
    at Object.Module._extensions..js (internal/modules/cjs/loader.js:712:10)
    at Module.load (internal/modules/cjs/loader.js:600:32)
    at tryModuleLoad (internal/modules/cjs/loader.js:539:12)
    at Function.Module._load (internal/modules/cjs/loader.js:531:3)
    at Module.require (internal/modules/cjs/loader.js:637:17)
    at require (internal/modules/cjs/helpers.js:22:18)

Затем я понял, что использую Gulp версии 4.0.0

Затем я изменил код на приведенный ниже: совместим с GulpV 4.0.0

const gulp = require("gulp");
const exec = require("child_process");

gulp.task('push', gulp.series('', function(){
    exec("clasp push")
}));

gulp.task('watch', gulp.series('push',function () {
    gulp.watch([
        '**/* .js',
        "**/* .html"
    ])
}));

gulp.task('default', gulp.series('watch', function(){
    gulp.watch([
        '**/* .js',
        "**/* .html"
    ]);
}));

Но тогда я все еще получил эту ошибку:

assert.js: 350 throw err;^

AssertionError [ERR_ASSERTION]: Task never defined: 
    at getFunction (/Users/micklo/Desktop/AppsScriptProjects/AppsScriptAppName/node_modules/undertaker/lib/helpers/normalizeArgs.js:15:5)
    at map (/Users/micklo/Desktop/AppsScriptProjects/AppsScriptAppName/node_modules/arr-map/index.js:20:14)
    at normalizeArgs (/Users/micklo/Desktop/AppsScriptProjects/AppsScriptAppName/node_modules/undertaker/lib/helpers/normalizeArgs.js:22:10)
    at Gulp.series (/Users/micklo/Desktop/AppsScriptProjects/AppsScriptAppName/node_modules/undertaker/lib/series.js:13:14)
    at Object.<anonymous> (/Users/micklo/Desktop/AppsScriptProjects/AppsScriptAppName/gulpfile.js:4:24)
    at Module._compile (internal/modules/cjs/loader.js:701:30)
    at Object.Module._extensions..js (internal/modules/cjs/loader.js:712:10)
    at Module.load (internal/modules/cjs/loader.js:600:32)
    at tryModuleLoad (internal/modules/cjs/loader.js:539:12)
    at Function.Module._load (internal/modules/cjs/loader.js:531:3)

Что я делаю не так?

Некоторая информация:

ОС: Mac Os (Mojave)

Версии Gulp -> Версия CLI: 2.1.0, Локальная версия: 4.0.0

Узел: v10.15.3

Застежка: 2.1.0

Ответы [ 2 ]

0 голосов
/ 23 июня 2019
   For re-write this gulpfile.js in gulp version 4.0 Please updated your 
   gulpfile.js according to your requirement. 

   this solution for assert.js:350 throw err; Bootstarp 4, SASS, gulp 4.

/////////////////////////////////////////////// /////////////////////////////////

    var gulp        = require('gulp');
    var browserSync = require('browser-sync').create();
    var sass        = require('gulp-sass');

    // Compile sass into CSS & auto-inject into browsers
    gulp.task('sass', function() {
        return gulp.src(['node_modules/bootstrap/scss/bootstrap.scss', 
        'src/scss/*.scss'])
            .pipe(sass())
            .pipe(gulp.dest("src/css"))
            .pipe(browserSync.stream());
    });

    // Move the javascript files into our /src/js folder
    gulp.task('js', function() {
        return gulp.src(['node_modules/bootstrap/dist/js/bootstrap.min.js', 
         'node_modules/jquery/dist/jquery.min.js', 
         'node_modules/popper.js/dist/umd/popper.min.js'])
            .pipe(gulp.dest("src/js"))
            .pipe(browserSync.stream());
    });

    // Static Server + watching scss/html files
    gulp.task('serve', gulp.series('sass', function() {

        browserSync.init({
            server: "./src"  
        });

        gulp.watch(['node_modules/bootstrap/scss/bootstrap.scss', 
         'src/scss/*.scss'], gulp.series('sass'));
        gulp.watch("src/*.html").on('change', browserSync.reload);
    }));

    gulp.task('default', gulp.parallel('js','serve'));
0 голосов
/ 30 марта 2019

Быстрое исправление этой конкретной ошибки состоит в том, что вы вызвали gulp.series для пустой / несуществующей задачи в вашей задаче push. gulp.series ожидает либо список строк, соответствующих объявленным вами задачам (таким как push, watch и default), либо функциям задач.

Избавление от задачи '' в серии исправит это:

gulp.task('push', gulp.series(function(){
    exec('clasp push')
}));

Однако теперь у вас есть другие проблемы:

  1. Ни одна из ваших задач не имеет обратных вызовов. Каждая задача Gulp является асинхронной, поэтому вы должны либо использовать обратные вызовы, либо return поток / обещание / источник событий / дочерний процесс / observable (примеры находятся в документации здесь ). Как пример:
gulp.task('push', function(done){
    exec('clasp push', function (err, stdout, stderr) {
        console.log(stdout);
        console.log(stderr);
        done(err);
      });
});
  1. Вы не передаете функцию или последовательность / параллельную последовательность в gulp.watch, поэтому она ничего не делает. Если вы пытаетесь запустить задачу push всякий раз, когда изменяются какие-либо файлы .js или .html, вам нужно изменить ее на:
gulp.task('watch', function(done) {
    gulp.watch([
        '**/*.js',
        '**/*.html'
    ], gulp.series('push'));
    done();
});
  1. У ваших шаблонов глобуса есть дополнительный пробел в команде наблюдения перед расширением файла: '**/*.js' вместо '**/* .js'
  2. Скорее всего, вы хотите, чтобы require("child_process").exec (с добавленным тегом .exec) позволял вам выполнять команды оболочки с использованием синтаксиса exec(command).
  3. Вам не нужно повторять команду watch при вызове ее в задаче default:
gulp.task('default', gulp.series('push', 'watch'));
  1. Вы можете удалить множество вызовов gulp.series, чтобы удалить вызовы задачи <anonymous> и упростить задачи. Каждой задаче нужна только одна функция, и вы, вероятно, должны стремиться использовать gulp.series и gulp.parallel с наборами именованных задач.

Изменяя эти точки, код должен выглядеть примерно так:

const gulp = require('gulp');
const exec = require('child_process').exec;

gulp.task('push', function(done){
    exec('clasp push', function (err, stdout, stderr) {
        console.log(stdout);
        console.log(stderr);
        done(err);
      });
});

gulp.task('watch', function(done) {
    gulp.watch([
        '**/*.js',
        '**/*.html'
    ], gulp.series('push'));
    done();
});

gulp.task('default', gulp.series('push', 'watch'));

Вы можете переписать это, используя рекомендуемый шаблон экспорта задач gulp v4:

const { series, watch } = require('gulp');
const { exec } = require('child_process');

function push(done) {
    exec('clasp push', function (err, stdout, stderr) {
        console.log(stdout);
        console.log(stderr);
        done(err);
      });
}

function watchPush() {
    return watch(['**/*.js', '**/*.html'], push);
}

exports.push = push;
exports.default = exports.watch = series(push, watchPush);
...