如何解决Gulp 4`series'无法同步完成任务
我有很多针对性/品牌应用,它们正在为其创建构建例程。基本概念是我叫gulp iosBuild --target app1
之类的东西,并且在编译之前会调整/移动各种文件/文件夹。我似乎有点愚蠢,因为在完成文件/文件夹调整位之前,就开始了编译步骤。在钻研Google漏洞后,我将以下内容一并整理。有人可以告诉我我在做什么错吗?
// fetch command line arguments
const arg = (argList => {
let arg = {},a,opt,thisOpt,curOpt;
for (a = 0; a < argList.length; a++) {
thisOpt = argList[a].trim();
opt = thisOpt.replace(/^\-+/,'');
if (opt === thisOpt) {
// argument value
if (curOpt) arg[curOpt] = opt;
curOpt = null;
} else {
// argument name
curOpt = opt;
arg[curOpt] = true;
}
}
return arg;
})(process.argv);
gulp.task('clean-ios',() => {
return gulp.src(['App_Resources/iOS/*.xcassets','platforms/ios/build/*.*'],{ read: false })
.pipe(clean());
});
// various items that are specific to each branded app
const iosConfigs = [
{
name: 'app1',bundleName: 'Sample App',profile: 'xxxx-xxxx-xxxx',appcenterId: 'xxxx-xxxx-xxxx'
},{
name: 'app2',bundleName: 'Sample App2',{
name: 'app3',bundleName: 'Sample App3',appcenterId: 'xxxx-xxxx-xxxx'
}
];
// Google told me to do this
function build(done) {
const setupTasks = iosConfigs.map(config => {
log(arg);
if (arg.target !== config.name) {
log('no match'); // if called with --target app2,return no-ops for app1,app3,etc
return (taskDone) => {
taskDone();
}
} else
return (taskDone) => {
gulp
.src('src/main.tns.template.ts')
.pipe(replace('%appcenterid%',config.appcenterId))
.pipe(rename('main.tns.ts'))
.pipe(gulp.dest('src'));
gulp
.src('package.json')
.pipe(replace(/(com\.acme\.)([^"]+)"/,'$1' + config.name + '"'))
.pipe(gulp.dest('.'));
gulp
.src('src/app/core/config/app.config.tns.ts')
.pipe(replace(/(https:\/\/)[^.]+(\.acme\.com)/,'$1' + config.name + '$2'))
.pipe(gulp.dest('src/app/core/config'));
gulp
.src('targets/' + config.name + '/build.xcconfig')
.pipe(gulp.dest('App_Resources/iOS'));
gulp
.src('targets/' + config.name + '/email_logo.png')
.pipe(rename('brandicon.png'))
.pipe(gulp.dest('App_Resources/iOS'));
gulp
.src('targets/' + config.name + '/*.scss')
.pipe(gulp.dest('src/styles'));
gulp
.src('targets/' + config.name + '/Assets.xcassets/**/*.*',{ base: 'targets/' + config.name })
.pipe(gulp.dest('App_Resources/iOS'));
taskDone();
}
});
const buildTasks = iosConfigs.map(config => {
log(arg);
if (arg.target !== config.name) {
log('no match');
return (taskDone) => {
taskDone();
}
} else {
return (taskDone) => {
log('running runner');
run('tns build ios --release --for-device --env.production=true --bundle --env.aot --provision=' + config.profile).exec(config.name,() => {
log('build done');
});
taskDone();
}
}
});
// my expectation is that everything in 'setupTasks' will complete before 'buildTasks' is called... doesn't happen that way though
return gulp.series('clean-ios',...setupTasks,...buildTasks,(seriesDone) => {
seriesDone();
done();
})();
}
exports.iosBuild = build;
解决方法
是的,您不必等待所有异步设置任务的完成。
return (taskDone) => {
gulp
.src('src/main.tns.template.ts')
.pipe(...)
gulp
.src('package.json')
.pipe(...);
...
taskDone(); // will be executed before any of above streams
}
您可以尝试重写此逻辑以使用gulp.parallel可组合函数,例如:
return gulp.parallel(
() => gulp
.src('src/main.tns.template.ts')
.pipe(...),() => gulp
.src('package.json')
.pipe(...),...
)
完整的setupTasks
代码:
const setupTasks = iosConfigs.map(config => {
log(arg);
if (arg.target !== config.name) {
log('no match'); // if called with --target app2,return no-ops for app1,app3,etc
return (taskDone) => {
taskDone();
}
} else
return gulp.parallel(
() => gulp
.src('src/main.tns.template.ts')
.pipe(replace('%appcenterid%',config.appcenterId))
.pipe(rename('main.tns.ts'))
.pipe(gulp.dest('src')),() => gulp
.src('package.json')
.pipe(replace(/(com\.acme\.)([^"]+)"/,'$1' + config.name + '"'))
.pipe(gulp.dest('.')),() => gulp
.src('src/app/core/config/app.config.tns.ts')
.pipe(replace(/(https:\/\/)[^.]+(\.acme\.com)/,'$1' + config.name + '$2'))
.pipe(gulp.dest('src/app/core/config')),() => gulp
.src('targets/' + config.name + '/build.xcconfig')
.pipe(gulp.dest('App_Resources/iOS')),() => gulp
.src('targets/' + config.name + '/!*.scss')
.pipe(gulp.dest('src/styles')),() => gulp
.src('targets/' + config.name + '/Assets.xcassets/!**!/!*.*',{base: 'targets/' + config.name})
.pipe(gulp.dest('App_Resources/iOS'))
)
});
,
@yurzui提到的问题是您的代码没有等待setupTasks中指定的所有gulp子任务完成并更早执行taskDone
。将您的setupTasks
函数更新为:
const setupTasks = iosConfigs.map(config => {
log(arg);
if (arg.target !== config.name) {
log('no match'); // if called with --target app2,etc
return (taskDone) => {
taskDone();
}
} else {
return (taskDone) => {
const task1 = () => gulp
.src('src/main.tns.template.ts')
.pipe(replace('%appcenterid%',config.appcenterId))
.pipe(rename('main.tns.ts'))
.pipe(gulp.dest('src'));
const task2 = () => gulp
.src('package.json')
.pipe(replace(/(com\.acme\.)([^"]+)"/,'$1' + config.name + '"'))
.pipe(gulp.dest('.'));
const task3 = () => gulp
.src('src/app/core/config/app.config.tns.ts')
.pipe(replace(/(https:\/\/)[^.]+(\.acme\.com)/,'$1' + config.name + '$2'))
.pipe(gulp.dest('src/app/core/config'));
const task4 = () => gulp
.src('targets/' + config.name + '/build.xcconfig')
.pipe(gulp.dest('App_Resources/iOS'));
const task5 = () => gulp
.src('targets/' + config.name + '/email_logo.png')
.pipe(rename('brandicon.png'))
.pipe(gulp.dest('App_Resources/iOS'));
const task6 = () => gulp
.src('targets/' + config.name + '/*.scss')
.pipe(gulp.dest('src/styles'));
const task7 = () => gulp
.src('targets/' + config.name + '/Assets.xcassets/**/*.*',{
base: 'targets/' + config.name
})
.pipe(gulp.dest('App_Resources/iOS'));
return gulp.series( //gulp.parallel
task1,task2,task3,task4,task5,task6,task7
)(taskDone);
}
}
});
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。