我在index.html
(CONFIG.APP.INDEX
中的完整路径)中查看更改时收到错误消息。我的所有任务都在单独的文件中。这是 tasks / watch.ts ,例如:
import * as CONFIG from '../config';
export default done => {
// other watches
gulp.watch(CONFIG.APP.INDEX, gulp.series('inject'));
};
第一次更改任务的正常执行,但在第二次更改时我收到此错误:
c:\~\node_modules\through2\node_modules\readable-stream\lib\_stream_writable.js:203
var er = new Error('write after end');
^
Error: write after end
at writeAfterEnd (c:\~\node_modules\through2\node_modules\readable-stream\lib\_stream_writable.js:203:12)
at DestroyableTransform.Writable.write (c:\~\node_modules\through2\node_modules\readable-stream\lib\_stream_writable.js:239:20)
at DestroyableTransform.ondata (c:\~\node_modules\through2\node_modules\readable-stream\lib\_stream_readable.js:531:20)
at emitOne (events.js:77:13)
at DestroyableTransform.emit (events.js:169:7)
at readableAddChunk (c:\~\node_modules\through2\node_modules\readable-stream\lib\_stream_readable.js:198:18)
at DestroyableTransform.Readable.push (c:\~\node_modules\through2\node_modules\readable-stream\lib\_stream_readable.js:157:10)
at DestroyableTransform.Transform.push (c:\~\node_modules\through2\node_modules\readable-stream\lib\_stream_transform.js:123:32)
at afterTransform (c:\~\node_modules\through2\node_modules\readable-stream\lib\_stream_transform.js:79:51)
at TransformState.afterTransform (c:\~\node_modules\through2\node_modules\readable-stream\lib\_stream_transform.js:58:12)
at c:\~\node_modules\vinyl-fs\lib\src\getContents\bufferFile.js:18:5
at c:\~\node_modules\graceful-fs\graceful-fs.js:78:16
at FSReqWrap.readFileAfterClose [as oncomplete] (fs.js:404:3)
tasks / 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 / inject / 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
),所有其他手表和任务正常工作。
答案 0 :(得分:2)
我怀疑您fixes.ts
的实施正在重复使用相同的noop()
结果,而不是每次运行任务时重新创建结果。
尝试转换fixes.ts
以返回工厂函数,每次调用任务时都会返回一个新的noop
实例。
<强> UTIL /注射/ 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();
};
对于上下文,我在我的项目中遇到了类似的问题,我不小心重复使用gulp流并获得“写完后”错误。
我怀疑你的代码与noop()
结果做同样的事情,因为一个值将被缓存为该模块的值。
版本不正确版本 - 我每次都会重复使用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']);
});
修复版本的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);
});