【问题标题】:Everytime I run gulp anything, I get a assertion error. - Task function must be specified每次我运行 gulp 任何东西时,我都会收到一个断言错误。 - 必须指定任务功能
【发布时间】:2018-12-08 11:20:28
【问题描述】:

我正在尝试运行下面的命令,但不幸的是我遇到了错误。

$ gulp build

在我的终端中,我收到了这个断言错误。我已经卸载了 nodeNPM 并使用 brew - How do I completely uninstall Node.js, and reinstall from beginning (Mac OS X) 重新安装了这些步骤。我的节点版本是 v10.5.0,npm 版本是6.1.0

我的系统是 MacOS High Sierra 10.13.2

assert.js:269
    throw err;
    ^

AssertionError [ERR_ASSERTION]: Task function must be specified
    at Gulp.set [as _setTask] (bulkit/startup-kit/node_modules/undertaker/lib/set-task.js:10:3)
    at Gulp.task (startup-kit/node_modules/undertaker/lib/task.js:13:8)
    at Object.<anonymous> 
    at Module._compile (internal/modules/cjs/loader.js:702:30)
    at Object.Module._extensions..js (internal/modules/cjs/loader.js:713:10)
    at Module.load (internal/modules/cjs/loader.js:612:32)
    at tryModuleLoad (internal/modules/cjs/loader.js:551:12)
    at Function.Module._load (internal/modules/cjs/loader.js:543:3)
    at Module.require (internal/modules/cjs/loader.js:650:17)
    at require (internal/modules/cjs/helpers.js:20:18)

package.json

{
    "name": "bulkit-startup",
    "version": "0.0.1",
    "description": "Bulkit Startup Kit",
    "main": "Gruntfile.js",
    "devDependencies": {
        "autoprefixer": "^6.3.6",
        "browser-sync": "^2.24.5",
        "gulp": "^4.0.0",
        "gulp-clean": "^0.3.2",
        "gulp-concat": "^2.6.0",
        "gulp-postcss": "^6.1.0",
        "gulp-sass": "^2.2.0",
        "gulp-sourcemaps": "^1.6.0",
        "jquery": "^3.3.1",
        "mq4-hover-shim": "^0.3.0",
        "panini": "^1.3.0",
        "rimraf": "^2.5.2"
    },
    "engines": {
        "node": ">=0.10.1"
    },
    "scripts": {
        "start": "gulp",
        "build": "gulp build"
    },
    "repository": {
        "type": "git",
        "url": "https://github.com/cssninjaStudio/bulkit.git"
    },
    "bugs": {
        "url": "https://github.com/cssninjaStudio/bulkit/issues",
        "email": "support@cssninja.io"
    },
    "author": "Css Ninja <hello@cssninja.io> (https://cssninja.io/themes/bulkit)",
    "license": "Commercial",
    "private": true,
    "dependencies": {
        "bulma": "^0.7.0",
        "del": "^3.0.0",
        "jquery-waypoints": "^2.0.5",
        "jquery.counterup": "^2.1.0",
        "scrollreveal": "^3.4.0",
        "slick-carousel": "^1.8.1",
        "wallop": "^2.4.1"
    }
}

gulpfile.js

var gulp = require('gulp');
var clean = require('gulp-clean');
var sass = require('gulp-sass');
var sourcemaps = require('gulp-sourcemaps');
var postcss = require('gulp-postcss');
var autoprefixer = require('autoprefixer');
var mq4HoverShim = require('mq4-hover-shim');
var rimraf = require('rimraf').sync;
var browser = require('browser-sync');
var panini = require('panini');
var concat = require('gulp-concat');
var port = process.env.SERVER_PORT || 8080;
var nodepath =  'node_modules/';
var assetspath =  'assets/';

// Starts a BrowerSync instance
gulp.task('server', ['build'], function(){
    browser.init({server: './_site', port: port});
});

// Watch files for changes
gulp.task('watch', function() {
    gulp.watch('scss/**/*', ['compile-scss', browser.reload]);
    gulp.watch('sass/**/*', ['compile-sass', browser.reload]);
    gulp.watch('js/**/*', ['copy-js', browser.reload]);
    gulp.watch('images/**/*', ['copy-images', browser.reload]);
    gulp.watch('html/pages/**/*', ['compile-html']);
    gulp.watch(['html/{layouts,includes,helpers,data}/**/*'], ['compile-html:reset','compile-html']);
    gulp.watch(['./src/{layouts,partials,helpers,data}/**/*'], [panini.refresh]);
});

// Erases the dist folder
gulp.task('reset', function() {
    rimraf('bulma/*');
    rimraf('scss/*');
    rimraf('assets/css/*');
    rimraf('assets/fonts/*');
    rimraf('images/*');
});

// Erases the dist folder
gulp.task('clean', function() {
    rimraf('_site');
});

// Copy Bulma filed into Bulma development folder
gulp.task('setupBulma', function() {
    //Get Bulma from node modules
    gulp.src([nodepath + 'bulma/*.sass']).pipe(gulp.dest('bulma/'));
    gulp.src([nodepath + 'bulma/**/*.sass']).pipe(gulp.dest('bulma/'));
});

// Copy static assets
gulp.task('copy', function() {
    //Copy other external font and data assets
    gulp.src(['assets/fonts/**/*']).pipe(gulp.dest('_site/assets/fonts/'));
    gulp.src([nodepath + 'slick-carousel/slick/fonts/**/*']).pipe(gulp.dest('_site/assets/css/fonts/'));
    gulp.src([nodepath + 'slick-carousel/slick/ajax-loader.gif']).pipe(gulp.dest('_site/assets/css/'));
});

//Theme Sass variables
var sassOptions = {
    errLogToConsole: true,
    outputStyle: 'compressed',
    includePaths: [nodepath + 'bulma/sass']
};

//Theme Scss variables
var scssOptions = {
    errLogToConsole: true,
    outputStyle: 'compressed',
    includePaths: ['./scss/partials']
};

// Compile Bulma Sass
gulp.task('compile-sass', function () {
    var processors = [
        mq4HoverShim.postprocessorFor({ hoverSelectorPrefix: '.is-true-hover ' }),
        autoprefixer({
            browsers: [
                "Chrome >= 45",
                "Firefox ESR",
                "Edge >= 12",
                "Explorer >= 10",
                "iOS >= 9",
                "Safari >= 9",
                "Android >= 4.4",
                "Opera >= 30"
            ]
        })//,
        //cssnano(),
    ];
    //Watch me get Sassy
    return gulp.src('./bulma/bulma.sass')
        .pipe(sourcemaps.init())
        .pipe(sass(sassOptions).on('error', sass.logError))
        .pipe(postcss(processors))
        .pipe(sourcemaps.write())
        .pipe(gulp.dest('./_site/assets/css/'));
});

// Compile Theme Scss
gulp.task('compile-scss', function () {
    var processors = [
        mq4HoverShim.postprocessorFor({ hoverSelectorPrefix: '.is-true-hover ' }),
        autoprefixer({
            browsers: [
                "Chrome >= 45",
                "Firefox ESR",
                "Edge >= 12",
                "Explorer >= 10",
                "iOS >= 9",
                "Safari >= 9",
                "Android >= 4.4",
                "Opera >= 30"
            ]
        })//,
        //cssnano(),
    ];
    //Watch me get Sassy
    return gulp.src('./scss/core.scss')
        .pipe(sourcemaps.init())
        .pipe(sass(sassOptions).on('error', sass.logError))
        .pipe(postcss(processors))
        .pipe(sourcemaps.write())
        .pipe(gulp.dest('./_site/assets/css/'));
});

// Compile Html
gulp.task('compile-html', function() {
    gulp.src('html/pages/**/*.html')
        .pipe(panini({
        root: 'html/pages/',
        layouts: 'html/layouts/',
        partials: 'html/includes/',
        helpers: 'html/helpers/',
        data: 'html/data/'
    }))
        .pipe(gulp.dest('_site'))
        .on('finish', browser.reload);
});

gulp.task('compile-html:reset', function(done) {
    panini.refresh();
    done();
});

// Compile css from node modules
gulp.task('compile-css', function() {
    return gulp.src([ 
        nodepath + 'slick-carousel/slick/slick.css',
        nodepath + 'slick-carousel/slick/slick-theme.css',
        nodepath + 'wallop/css/wallop.css',
        //Additional static css assets
        assetspath + 'css/icons.min.css',
    ])
        .pipe(concat('app.css'))
        .pipe(gulp.dest('./_site/assets/css/'));
});

// Compile js from node modules
gulp.task('compile-js', function() {
    return gulp.src([ 
        nodepath + 'jquery/dist/jquery.min.js', 
        nodepath + 'slick-carousel/slick/slick.min.js', 
        nodepath + 'scrollreveal/dist/scrollreveal.min.js',
        nodepath + 'waypoints/lib/jquery.waypoints.min.js',
        nodepath + 'waypoints/lib/shortcuts/sticky.min.js',
        nodepath + 'jquery.counterup/jquery.counterup.min.js',
        nodepath + 'wallop/js/Wallop.min.js',
        //Additional static js assets
        assetspath + 'js/ggpopover/ggpopover.min.js',
        assetspath + 'js/ggpopover/ggtooltip.js',
        assetspath + 'js/embed/embed.js',
        assetspath + 'js/gmap/gmap.min.js',
    ])
        .pipe(concat('app.js'))
        .pipe(gulp.dest('./_site/assets/js/'));
});

//Copy Theme js to production site
gulp.task('copy-js', function() {
    gulp.src('js/**/*.js')
        .pipe(gulp.dest('./_site/assets/js/'));
});

//Copy images to production site
gulp.task('copy-images', function() {
    gulp.src('images/**/*')
        .pipe(gulp.dest('./_site/assets/images/'));
});

gulp.task('init', ['setupBulma']);
gulp.task('build', ['clean','copy', 'compile-js', 'compile-css', 'copy-js', 'compile-sass', 'compile-scss', 'compile-html', 'copy-images']);
gulp.task('default', ['server', 'watch']);

【问题讨论】:

    标签: gulp gulp-watch


    【解决方案1】:

    Gulp 4.0 改变了任务的定义方式,如果任务依赖于另一个任务来执行。列表参数已被弃用。

    gulpfile.js 中的一个例子是:

    // Starts a BrowerSync instance
    gulp.task('server', ['build'], function(){
      browser.init({server: './_site', port: port});
    });
    

    他们引入了gulp.series()gulp.parallel(),而不是列表参数。

    这个任务应该改成这样:

    // Starts a BrowerSync instance
    gulp.task('server', gulp.series('build', function(){
      browser.init({server: './_site', port: port});
    }));
    

    我不是这方面的专家。您可以在 gulp documentation for running tasks in series 或以下 Jhey Thompkins 和 Stefan Baumgartner 的优秀博客文章中看到更强大的示例

    https://codeburst.io/switching-to-gulp-4-0-271ae63530c0

    https://fettblog.eu/gulp-4-parallel-and-series/

    【讨论】:

    • 这会将我的错误从Task must be specified 更改为Task never defined
    • @2540625 我希望你最终能解决这个问题,但我遇到了同样的问题,直到我用 series() / parallel() 调用移动了 gulp.task 的定义 below 在那里定义了命名的任务。这似乎是在定义之前尝试使用函数的经典 javascript 错误。
    • @Jon 这正是我的情况,我将任务系列定义移到了我定义任务的部分下方并且它起作用了。 (这在 v3 中不是问题)。
    【解决方案2】:

    将 package.json 文件中的 gulp 版本降低到 3.9.1-

    "gulp": "^3.9.1",
    

    【讨论】:

    • 如果您使用的是 Node v10,请不要这样做。
    • @bbsimonbb 你能详细说明一下吗?
    • @Henri 版本 4 更改了任务的运行方式,因此为了使他当前的代码正常工作,他需要运行 gulp 3.9.1。但更好的答案是更新他的代码以兼容 gulp 4+
    【解决方案3】:

    https://fettblog.eu/gulp-4-parallel-and-series/

    因为 gulp.task(name, deps, func) 已替换为 gulp.task(name, gulp.{series|parallel}(deps, func))

    您使用的是最新版本的 gulp,但代码较旧。修改代码或降级。

    【讨论】:

      【解决方案4】:

      我在使用 Gulp 时遇到了同样的错误。解决方案是切换到 Gulp 版本 3.9.1,本地版本和 CLI 版本都适用。

      sudo npm install -g gulp@3.9.1
      

      在项目文件夹中运行

      npm install gulp@3.9.1
      

      【讨论】:

        【解决方案5】:

        您无需将 gulp 从 gulp 4 降级。使用 gulp.series() 组合多个任务。首先在全局安装 gulp

        npm install --global gulp-cli

        然后在您的工作目录本地安装

        npm install --save-dev gulp

        see details here

        示例:

        package.json

        {
          "name": "gulp-test",
          "version": "1.0.0",
          "description": "",
          "main": "index.js",
          "scripts": {
            "test": "echo \"Error: no test specified\" && exit 1"
          },
          "author": "",
          "license": "ISC",
          "devDependencies": {
            "browser-sync": "^2.26.3",
            "gulp": "^4.0.0",
            "gulp-sass": "^4.0.2"
          },
          "dependencies": {
            "bootstrap": "^4.3.1",
            "jquery": "^3.3.1",
            "popper.js": "^1.14.7"
          }
        }
        

        gulpfile.js

        var gulp = require("gulp");
        var sass = require('gulp-sass');
        var browserSync = require('browser-sync').create();
        
        // Specific Task
        function js() {
            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());
        }
        gulp.task(js);
        
        // Specific Task
        function gulpSass() {
            return gulp
            .src(['src/scss/*.scss'])
            .pipe(sass())
            .pipe(gulp.dest('src/css'))
            .pipe(browserSync.stream());
        }
        gulp.task(gulpSass);
        
        // Run multiple tasks
        gulp.task('start', gulp.series(js, gulpSass));
        

        运行gulp start 来触发多个任务并运行gulp jsgulp gulpSass 来执行特定任务。

        【讨论】:

        • 这已经足够接近了。必须检查 Gulp 网站以获取正确的语法并添加导出。
        【解决方案6】:

        步骤:

        1. “吞咽”:“^3.9.1”,
        2. npm 安装
        3. gulp 样式

        【讨论】:

          【解决方案7】:

          尝试替换 gulpfile.js 的最后一行

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

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

          【讨论】:

            【解决方案8】:

            为了修复错误而不断更改 gulp 和 npm 版本是不好的。重新安装工作机器后的几天,我遇到了几个例外。并浪费了大量的时间来重新安装和修复它们。

            所以,我决定全部升级到最新版本:

            npm -v : v12.13.0 
            node -v : 6.13.0
            gulp -v : CLI version: 2.2.0 Local version: 4.0.2
            

            出现此错误是因为它在 gulpfile 中的编码方式,而不是版本不匹配。 所以,在这里你必须更改 gulpfile 中的两件事以与 Gulp 版本 4 保持一致。 与版本 3 相比,Gulp 4 更改了启动任务的方式。

            1. 在版本 4 中,您必须将任务定义为一个函数,然后才能通过它的字符串名称将其作为 gulp 任务调用。在 V3 中:

            gulp.task('serve', ['sass'], function() {..});

            但在 V4 中应该是这样的:

            function serve() {
            ...
            }
            gulp.task('serve', gulp.series(sass));
            
            1. 正如@Arthur 所提到的,您需要更改将参数传递给任务函数的方式。在 V3 中是这样的:

            gulp.task('serve', ['sass'], function() { ... });

            但在V4中,应该是:

            gulp.task('serve', gulp.series(sass));
            

            【讨论】:

              【解决方案9】:

              问题是您使用的是 gulp 4,而 gulfile.js 中的语法是 gulp 3。所以要么将 gulp 降级到 3.x.x,要么使用 gulp 4 语法。

              语法 Gulp 3:

              gulp.task('default', ['sass'], function() {....} );
              

              语法 Gulp 4:

              gulp.task('default', gulp.series(sass), function() {....} );
              

              您可以阅读更多关于 gulp 和 gulp 任务的信息: https://medium.com/@sudoanushil/how-to-write-gulp-tasks-ce1b1b7a7e81

              【讨论】:

                【解决方案10】:

                用 gulp.series() 替换 [] 确实对我有用,我需要做的另一个更改是移动我的主要任务'Ex. gulp main-task' 使用 Gulp v4.02 到 Gulp 文件的末尾

                【讨论】:

                  【解决方案11】:

                  从 Gulp 3.x 迁移到 Gulp 4.x 时,我们遇到以下常见错误:

                  错误:

                  • AssertionError [ERR_ASSERTION]:必须指定任务函数
                  • AssertionError [ERR_ASSERTION]:任务从未定义:
                  • 以下任务未完成:您是否忘记发出异步完成信号?

                  关于任务定义和执行,需要注意以下几点:

                  1. 首先定义任务
                  2. 使用返回
                  3. 然后用 gulp.series() 执行

                  这里是使用 Gulp v4 的快速 Gulp 代码

                  // First define task with Return
                  gulp.task('css-minify', function () {
                      return gulp.src('assets/images/*.*')
                          .pipe(smushit({verbose: true}))
                          .pipe(gulp.dest('assets/images'));
                  });
                  
                  // Then execute task with bracket '()' instead of '[]'
                  gulp.task('default', gulp.series('css-minify'));
                  

                  【讨论】:

                    【解决方案12】:

                    用 gulp.task(gulp.series()) 更新 gulp.task() 后工作;

                    【讨论】:

                      猜你喜欢
                      • 2021-11-19
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      • 2020-08-13
                      相关资源
                      最近更新 更多