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

もうエラーは発生しませんが、タスクは 4 ミリ秒以内に終了し、何もしません。パーツを削除する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();
});

watchここでコールバックを呼び出すと、タスクが正常に完了したことを gulp が認識できるようになります。この場合の「正常に完了」とは、タスクが 2 つの監視を開始したことを意味します。watch両方の監視は、ジョブが終了した後も引き続き実行されます。watchしたがって、タスクが 4ms 後に終了するという事実に問題はありません。

ただし、ウォッチを開始しても、リスナー関数の実行が自動的にトリガーされるわけではありません。最初に監視対象ファイルの 1 つを変更する必要があります。または、最初の起動時にウォッチをトリガーする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 に答える