0

我不知道为什么我会得到

您是否忘记发出异步完成信号?

这是我的设置:

gulp.task('compile-ts', () => {
    return tsProject.src(config.files.src.ts)
        .pipe($.tap((file, t) => {
            logVerbose('Compiling "' + file.path + "'");
        }))
        .pipe($.sourcemaps.init())
        .pipe($.typescript(tsProject))
        .pipe($.sourcemaps.write('./'))
        .pipe($.chmod(755))
        .pipe(gulp.dest(config.dist));
});

gulp.task('copy-assets', () => {
    return gulp.src(config.files.src.css_html_js, { base: config.src })
        .pipe($.tap((file, t) => {
            logVerbose('Copying "' + getFileName(file.path) + "'");
        }))
        .pipe($.chmod(755))
        .pipe(gulp.dest(config.dist));
});

gulp.task('browser-sync', (done) => {
    browserSync.init({
        "port": 3000,
        "startPath": "dist/index.html",
        "browser": "chrome",
        "logLevel": "silent",
        "server": {
            "middleware": {
                "0": null
            }
        }
    }, done);  
    process.on('exit', () => {
        browserSync.exit();
    });
})

gulp.task('watch', gulp.parallel(() => {
    gulp.watch(config.files.ts, gulp.series('compile-ts'));
}, () => {
    gulp.watch(config.files.css_html_js, gulp.series('copy-assets'));
}));

gulp.task('serve-dist', gulp.parallel('watch', 'browser-sync'));

根据堆栈跟踪,有问题的行是

gulp.watch(config.files.ts, gulp.series('compile-ts'));

任务里面watch。该任务compile-ts正在运行并返回一个流,这应该足以表明完成。但是为什么我还是会收到错误消息?

这是gulp@4.0.0-alpha.2.

编辑:

watch将任务更改为

gulp.task('watch', (done) => {
    gulp.watch(config.files.css_html_js, gulp.series('copy-assets'));
    gulp.watch(config.files.ts, gulp.series('compile-ts'));
    done();
});

我不再收到任何错误,但任务在 4ms 内完成并且什么都不做。如果我删除该done部分,我会再次收到相同的错误。

EDIT2:我将任务分成更多以便能够查明问题,

gulp.task('watch-ts', () => {
    return gulp.watch(config.files.ts, gulp.series('compile-ts'));
});

gulp.task('watch-assets', () => {
    return gulp.watch(config.files.css_html_js, gulp.series('copy-assets'));
});

gulp.task('watch', gulp.parallel('watch-ts', 'watch-assets'));

现在watch-tswatch-assets两者都给我那个错误信息。据我所知,其中任何一个都会返回一个流。

4

1 回答 1

1

总是需要在组成任务的每个函数中发出异步完成信号。不仅仅是那些异步的。不仅仅是那些使用流的人。如果您没有在函数中返回流,您仍然需要以某种方式发出异步完成信号(通常通过调用回调)。

因此,您的第一次编辑已经正确:

gulp.task('watch', (done) => {
  gulp.watch(config.files.css_html_js, gulp.series('copy-assets'));
  gulp.watch(config.files.ts, gulp.series('compile-ts'));
  done();
});

在此处调用回调可确保 gulp 知道您的watch任务已成功完成。在这种情况下“成功完成”意味着您的任务已经启动了两个手表。watch即使在作业完成后,两个手表仍将继续运行。watch因此,任务在 4ms 后终止这一事实并没有错。

但是,启动手表不会自动触发侦听器函数的执行。您必须先修改其中一个监视文件。或者,您可以传递第一次启动时触发手表的ignoreInitial选项:gulp.watch()

gulp.task('watch', (done) => {
  gulp.watch(config.files.css_html_js, {ignoreInitial:false}, gulp.series('copy-assets'));
  gulp.watch(config.files.ts, {ignoreInitial:false}, gulp.series('compile-ts'));
  done();
});
于 2016-07-13T15:55:14.800 回答