目标
了解 TaskExecutor 启动应用编译的具体任务流程
注意:对实际业务应用开发没有帮助
流程
注释源码
任务执行整体逻辑
//通过名字执行任务
executeTaskByName(e) {
//根据编译任务名称获取依赖的所有具体任务,将其加入队列中
task_control_center_js_1.taskControlCenter.initTaskQueueBeforeRun(e),
//注册任务执行状态监听器(WORK: 完成,失败,更新; TASK: 完成,失败,更新) task_control_center_listener_register_js_1.taskControlCenterListenerRegister.registryAllDefault(),
index_js_1.hvigor.startParameters.hvigorfileTypeCheck &&
(0, ts_check_js_1.hvigorfileTypeCheck)();
//循环逐个执行具体任务
const t = setInterval(() => {
//获取具体任务
const e = task_control_center_js_1.taskControlCenter.popRunnableTask();
//具体任务是否已定义
if (void 0 !== e)
//已没有任务在执行,可以开始执行此次具体的任务
if (
((hvigor_process_js_1.hvigorProcess.hasTaskDone = !0),
//更新任务状态
e.taskExecutedStatus.setState(
task_execute_status_js_1.TASK_EXECUTE_STATUS.PENDING
),
//开始执行具体的任务
executeOneTask(e))
) {
//任务是否有效
if (!e.getEnabled()) return;
e.taskExecutedStatus.isUpToDate()
? task_control_center_js_1.taskControlCenter.emit(
task_listener_event_id_js_1.TASK_CENTER_TASK_EVENT_ID
.TASK_UP_TO_DATE,from harvey
e.getPath()
)
: e.taskExecutedStatus.allWorksHasFinished() &&
task_control_center_js_1.taskControlCenter.emit(
task_listener_event_id_js_1.TASK_CENTER_TASK_EVENT_ID
.TASK_FINISHED,
e.getPath()
);
} else {
//清除任务执行循环器
clearInterval(t);
}
process_1.default.nextTick(() => {
//判断队列中的所有任务是否都已执行完毕
task_control_center_js_1.taskControlCenter.allTasksHasExecuted() &&
void 0 === e &&
(clearInterval(t),
hvigor_process_js_1.hvigorProcess.emit(
event_id_options_js_1.HVIGOR_PROCESS_EVENT_ID.FINISHED
));
});
}, 1);
task_control_center_js_1.taskControlCenter.setIntervalId(t),
logConfigurationCostTime();
}
}
执行具体任务的逻辑
function executeOneTask(e) {
try {
return (
//更新任务状态为运行
e.taskExecutedStatus.setState(
task_execute_status_js_1.TASK_EXECUTE_STATUS.RUNNING
),
e.metric.start(),
//将任务加入到运行任务中
task_control_center_js_1.taskControlCenter.pushRunningTask(e),
//任务状态是否有效, 注意嵌套的三目运算符
e.getEnabled()
? ((0, task_util_js_1.isIncrementalTask)(e) //是否是增量任务
? (0, incremental_task_executor_js_1.doIncrementalTask)(e) //执行增量任务
: e.execute(), //直接执行任务
!0)
: (task_control_center_js_1.taskControlCenter.emit(
task_listener_event_id_js_1.TASK_CENTER_TASK_EVENT_ID.TASK_DISABLED,
e.getPath()
),
!0)
);
} catch (t) {
return (
!(t instanceof Error) ||
(task_control_center_js_1.taskControlCenter.emit(
task_listener_event_id_js_1.TASK_CENTER_TASK_EVENT_ID.TASK_FAILED,
e.getPath()
),
hvigor_process_js_1.hvigorProcess.error(t),
!1)
);
}
}
定义增量任务的标准
function isIncrementalTask(e) {
//任务定义的类型必须是IncrementalTask
if (!(e instanceof incremental_task_js_1.IncrementalTask)) return !1;
//declareInputs, declareInputFiles, declareOutputFiles具体实现,均定义在具体的任务中
const t = e.declareInputs(),
s = e.declareInputFiles(),
a = e.declareOutputFiles(),
r = 0 === t.size && 0 === s.collect().size && 0 === a.collect().size;
return e instanceof incremental_exec_task_js_1.IncrementalExecTask
? !(
"" === e.declareExecutionTool() &&
"" === e.declareExecutionCommand() &&
0 === e.declareExecutionEnv().size &&
r
)
: (r &&
log.debug(
`${e.getPath()} is declared as IncrementTask, but does not implement any incremental method.`
),
!r);
}
执行增量任务
function doIncrementalTask(e) {
const t = e,
//将具体任务重新封装一次结构
r = task_converter_js_1.taskConVert.convert(t);
if (
//任务执行前,由具体任务实现此方法内容,以便提示用户当前执行的任务可能存在问题,比如:跳过签名
(t.beforeAlwaysAction(),
(function () {
if (!index_js_1.hvigor.startParameters.incrementalExecution) return !0;
const t = e.taskExecutedStatus.unTrackStateReason;
if (t)
return (
log.debug(
`${e.getPath()} will not track state,eg do incremental,because:${t}` from harvey
),
!0
);
return !1;
})())
)
//declareInputs, declareInputFiles, execute具体实现,均定义在具体的任务中
t.declareInputs(), t.declareInputFiles(), r.execute();
else {
r.preExecute()
? (t.taskExecutedStatus.setIsUpToDate(!0),
(trace_build_analyze_js_1.traceBuildAnalyze.hasIncremental = !0))
: r.execute();
}
}
祝好运!