我的应用程序依赖于公司内部的TS库,但该库很少进行编辑。我刚刚更新了它,现在用于构建它的其中一个gulp任务将会失败。所有其他的任务可以在单独使用或并行/顺序使用时正常工作,但是使用@rollup/stream
软件包的任务会在声明完成后导致gulp挂起。当自动化构建最终杀掉构建时,发现了此问题,因为它已经暂停了2小时等待gulp任务完成。
我必须更新我们的内部库,因为它由于以下问题而导致构建失败。
'rollup' errored after 1.51 s
Error: '__spreadArray' is not exported by node_modules\tslib\tslib.es6.js, imported by src\ObjectUtils.ts
所以我将tsconfig.json
文件从"target": "es5",
更新为"target": "es6",
,这导致了使用rollup时的停顿。
运行gulp rollup
会得到以下输出:
Using gulpfile path/to/gulp/file
Starting 'rollup'...
//
// Outputs all the files being rolled up here...
//
Finished 'rollup' after 1.43 s
// The gulp process then stays open instead of closing and returning me to my prompt
作为一个例子,我在本地运行了该任务,然后使用control+c退出,它报告等待了10m15s。
我阅读了所有能找到的文档和SO问题,确信我们正在按照async gulp tasks文档所建议的处理流的方式进行,但仍无法正常工作。然后我尝试手动关闭返回的rollup流,使用.on('end', () => { //etc })
,将事物包装在承诺中并返回一个在流完成时解决的承诺,使用提供给每个任务函数的回调,以上的组合,但我无法使rollup任务正确完成并将控制权返回到提示符。
我已经包含了gulpfile、tsconfig.json和我的package.json依赖项的相关部分。
// gulpfile.js
const gulp = require('gulp');
const gulpif = require('gulp-if');
const terser = require("gulp-terser");
const typescript = require("@rollup/plugin-typescript");
const rollup = require("@rollup/stream");
const buffer = require('vinyl-buffer');
const source = require('vinyl-source-stream');
const production = process.env.NODE_ENV == 'production';
function rollupTask () {
// rollup() returns a stream, so returning this should satisfy the async tasks requirements.
// When the stream closes it should tell gulp the tasks has finished right?
return rollup({
input: "./src/main.ts",
external: [
"lodash",
],
output: {
format: "cjs",
sourcemap: true
},
plugins: [
typescript(),
],
})
.pipe(source("common.bundle.js"))
.pipe(buffer())
.pipe(gulpif(production, terser()))
.pipe(gulp.dest('./dist'));
};
exports.rollup = rollupTask;
// tsconfig.json
{
"compilerOptions": {
"declaration": false,
"module": "es2015",
"target": "es6",
"emitDecoratorMetadata": true,
"listFiles": true,
"noImplicitAny": false,
"noUnusedLocals": true,
"noLib": false,
"removeComments": true,
"sourceMap": true,
"experimentalDecorators": true,
"lib": [
"ES5",
"Dom",
"ScriptHost",
"ES2015",
"ES2016",
"ES2017"
]
}
}
// package.json dependencies
"dependencies": {
"lodash": "^4.17.5"
},
"devDependencies": {
"@rollup/plugin-typescript": "^6.1.0",
"@rollup/stream": "^1.1.0",
"@types/lodash": "^4.14.165",
"del": "^6.0.0",
"gulp": "^4.0.2",
"gulp-if": "^3.0.0",
"gulp-sourcemaps": "^3.0.0",
"gulp-terser": "^2.0.0",
"gulp-tslint": "^8.0.0",
"gulp-typescript": "^5.0.1",
"merge2": "^1.4.1",
"rollup": "^2.33.3",
"tslint": "^6.1.3",
"typescript": "^4.0.5",
"vinyl-buffer": "^1.0.1",
"vinyl-source-stream": "^2.0.0"
},
如果发现我可以继续在
tsconfig.json
中使用"target": "es5"
,并找到了__spreadArray
问题的解决方法,那么我也可以这样做。