Hvigor 编译任务执行流程

224 阅读1分钟

目标

了解 TaskExecutor 启动应用编译的具体任务流程

注意:对实际业务应用开发没有帮助

流程

WX20240418-230031@2x.png

注释源码

任务执行整体逻辑

//通过名字执行任务
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();
  }
}

祝好运!