----最重要的更新------
一些朋友指出,我应该从任务中返回流。没错,但无济于事。
实际上,在我的第一个版本中,我返回了流,而var rs
零件曾经是return
。
问题是,任务完成后会生成已编译的js文件。因此,无论我使用done
回调还是从任务返回流,该任务确实已完成,并且下一个任务已启动,但是生成的文件尚未准备好。
----这是原始问题----
我有一个gulpfile.js,它首先将一堆.ts文件编译成js,然后将输出的js文件打包到webpack中。这是我的gulpfile.js的重要部分:
const gulp = require("gulp");
const ts = require("gulp-typescript");
const webpack = require("webpack-stream");
gulp.task("default", ["build"]);
gulp.task("build", ["compile", "pack"]);
gulp.task("compile", task_compile);
gulp.task("pack", ["compile"], task_pack);
function task_compile(done) {
return util_compile_ts("main", done);
}
function task_pack(done) {
return util_pack_js("main", done);
}
function util_compile_ts(proj, done) {
const dirSrc = "src/" + proj;
const dirCompiled = "out/compiled/" + proj;
const dirBuilt = "out/built";
var tscfg = require("./" + dirSrc + "/tsconfig.json").compilerOptions;
var rs = gulp
.src(dirSrc + "/**/*.ts")
.pipe(ts(tscfg))
.pipe(gulp.dest(dirCompiled))
.on("end", done);
}
function util_pack_js(proj, done) {
const dirSrc = "src/" + proj;
const dirCompiled = "out/compiled/" + proj;
const dirBuilt = "out/built";
var wpcfg = require("./" + dirSrc + "/webpack.config.js");
wpcfg.context = path.resolve(dirSrc, wpcfg.context)
wpcfg.output.path = path.resolve(dirSrc, wpcfg.output.path)
var rs = gulp
.src(dirCompiled + "/**/*.js")
.pipe(webpack(wpcfg))
.pipe(gulp.dest(dirBuilt))
.on("end", done);
}
如果我再跑gulp compile
,那gulp pack
没问题。但是当我只运行时gulp
,就会发生错误:
Error: Entry module not found: Error: Cannot resolve 'file' or 'directory'
并且列出了已编译的js文件的路径,该路径本身还可以,但是尚未复制到该compiled
文件夹中。
我观察了ts编译的过程,发现ts任务在实际生成输出文件之前完成。运行时gulp compile
,gulp任务显示完成,并且1或2秒后,生成的文件出现在该compiled
文件夹中。
因此,当我运行时gulp
,pack
任务将在compile
任务完成后立即开始,那时js输出尚未在磁盘上准备好,因此该pack
任务失败了,因为它找不到输入。
所以问题是,我如何等待已编译的js文件准备就绪并继续执行下一个任务?
PS我不想使用setTimeout进行硬编码的等待...。
谢谢,安德斯
根据返回的流的文档gulp-typescript
ts
不是您的JavaScript文件。它的组合.js
和.d.ts
。参考TypeScript示例,了解他们如何选择流中的JavaScript文件。
尝试通过选择JavaScript文件来更改流,并进一步返回流以让gulp为您处理完成的回调。
function util_compile_ts(proj, done) {
const dirSrc = "src/" + proj;
const dirCompiled = "out/compiled/" + proj;
const dirBuilt = "out/built";
var tscfg = require("./" + dirSrc + "/tsconfig.json").compilerOptions;
return gulp
.src(dirSrc + "/**/*.ts")
.pipe(ts(tscfg))
.js
.pipe(gulp.dest(dirCompiled));
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句