Gulp 4-错误:结束后写



当我注意index.html的更改(CONFIG.APP.INDEX中的完整路径)时,我会遇到错误。我所有的任务都在单独的文件中。这是 task/watch.ts ,例如:

import * as CONFIG from '../config';
export default done => {
  // other watches
  gulp.watch(CONFIG.APP.INDEX, gulp.series('inject'));
};

第一个更改任务是正常执行的,但是在第二个更改时,我会遇到此错误:

c:~node_modulesthrough2node_modulesreadable-streamlib_stream_writable.js:203
  var er = new Error('write after end');
           ^
Error: write after end
    at writeAfterEnd (c:~node_modulesthrough2node_modulesreadable-streamlib_stream_writable.js:203:12)
    at DestroyableTransform.Writable.write (c:~node_modulesthrough2node_modulesreadable-streamlib_stream_writable.js:239:20)
    at DestroyableTransform.ondata (c:~node_modulesthrough2node_modulesreadable-streamlib_stream_readable.js:531:20)
    at emitOne (events.js:77:13)
    at DestroyableTransform.emit (events.js:169:7)
    at readableAddChunk (c:~node_modulesthrough2node_modulesreadable-streamlib_stream_readable.js:198:18)
    at DestroyableTransform.Readable.push (c:~node_modulesthrough2node_modulesreadable-streamlib_stream_readable.js:157:10)
    at DestroyableTransform.Transform.push (c:~node_modulesthrough2node_modulesreadable-streamlib_stream_transform.js:123:32)
    at afterTransform (c:~node_modulesthrough2node_modulesreadable-streamlib_stream_transform.js:79:51)
    at TransformState.afterTransform (c:~node_modulesthrough2node_modulesreadable-streamlib_stream_transform.js:58:12)
    at c:~node_modulesvinyl-fslibsrcgetContentsbufferFile.js:18:5
    at c:~node_modulesgraceful-fsgraceful-fs.js:78:16
    at FSReqWrap.readFileAfterClose [as oncomplete] (fs.js:404:3)

任务/inject.ts 任务:

declare var require;
const gulp = require('gulp');
const plugins = require('gulp-load-plugins')();
import * as CONFIG from '../config';
export default done => {
  return gulp
    .src(CONFIG.APP.INDEX)
    .pipe(require('../util/inject/fixes').default) // <--- PROBLEM IS HERE
    // other stuff...
    .pipe(gulp.dest(CONFIG.DST.BUILD))
    .on('error', plugins.util.log);
};

util/indment/fixes.ts 任务

declare var require;
const plugins = require('gulp-load-plugins')();
// errors even with this...
export default plugins.util.noop();

任务是从gulpfile.ts/index.ts加载的:

fs.readdirSync('./gulpfile.ts/tasks').map(file => {
  let name = file.replace(/.ts$/, '');
  let task = require(path.join(path.resolve('.'), 'gulpfile.ts', 'tasks', file));
  gulp.task(name, task.default);
});

我已经设法确定了错误的来源,但不知道是什么原因导致了错误或如何修复它。仅在第一次更改和任务执行后观看index.html 时才会发生问题。手动运行任务正常工作(gulp inject),所有其他手表和任务正常工作。

我怀疑您对fixes.ts的实现正在重复使用相同的noop()结果,而不是每次运行任务时重新创建结果。

尝试将fixes.ts转换为返回出厂功能,每次调用任务时都会返回新的noop实例。

util/indment/fixes.ts

declare var require;
const plugins = require('gulp-load-plugins')();
// Return a function that will return a new `noop` instance each time:
export default () => {
    return plugins.util.noop();
};

对于上下文,我在项目中遇到了类似的问题,我意外重复了墨西哥流并遇到"终点"错误。

我怀疑您的代码正在使用noop()结果做同样的事情,因为一个值将被缓存为该模块的值。

不正确的我的gulpfile.js的版本 - 每次我的gulp.dest()调用的结果都在重复使用。

let gulp = require('gulp');
let merge = require('merge-stream');
let _path = require('path');
let files = {
    'html': {
        src: _path.join('public', 'index.html'),
        dest: gulp.dest('public')  // <-- WRONG use of `gulp.dest()`, causes result to be reused and gives "write after end" error
    },
    'files': 'html': {
        src: _path.join('files', '*'),
        dest: gulp.dest('files')  // <-- WRONG use of`gulp.dest()`
    },
};
gulp.task('copy', function(){
    let html = gulp.src(files.html.src)
        .pipe(files.html.dest);   // <-- `gulp.dest()` should be here
    let files = gulp.src(files.files.src)
        .pipe(files.files.dest);  // <-- `gulp.dest()` should be here
    return merge(html, files);
});

gulp.task('copy-watch', function(){
    let srcList = Object.keys(files).map(i => files[i].src);
    gulp.watch(srcList, ['copy']);
});

filex 我的gulpfile.js的版本 - 每次运行任务时都会调用gulp.dest()

let files = {
    'html': {
        src: _path.join('public', 'index.html'),
        dest: 'public'  // <-- removed `gulp.dest()` call from here
    },
    'files': 'html': {
        src: _path.join('files', '*'),
        dest: 'files'  // <-- removed `gulp.dest()` call from here
    },
};
gulp.task('copy', function(){
    let html = gulp.src(files.html.src)
        .pipe(gulp.dest(files.html.dest));  // <-- CORRECT use of`gulp.dest()`
    let files = gulp.src(files.files.src)
        .pipe(gulp.dest(files.files.dest)); // <-- CORRECT use of `gulp.dest()`
    return merge(html, files);
});

最新更新