2016-06-18 12 views
0

index.html(フルパスはCONFIG.APP.INDEX)の変更を監視するとエラーが発生します。すべての私の仕事は別々のファイルにあります。これは例えば、タスク/ watch.tsです:最初の変更タスクのGulp 4 - エラー:書き込み終了後

import * as CONFIG from '../config'; 

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

正常に実行されますが、2番目の変更に私はこのエラーを取得しています:

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) 

タスク/注入.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 /注入/ 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)、他のすべての時計とタスクは正常に動作します。

答えて

2

fixes.tsの実装では、タスクが実行されるたびに結果が再作成されるのではなく、同じnoop()結果が再利用されている可能性があります。

は新しいnoopインスタンスにタスクが起動されるたびに返されますファクトリ関数を返すようにfixes.tsを変換してみます。

の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(); 
}; 

は、私はちょうど私が誤ってゴクゴクストリームを再利用し、「後に書き込みを得ていた私のプロジェクトで同様の問題がありました終了 "エラー。

私はあなたのコードがnoop()結果で同じ種類のことをしていると推測します。その1つの値はそのモジュールの値としてキャッシュされるからです。

私の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); 
}); 
: - 私のgulpfile.jsの

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']); 
}); 

固定バージョンgulp.dest()は、タスクが実行されるたびに呼び出されています

関連する問題