携手创作,共同生长!这是我参与「日新计划 8 月更文应战」的第3天,点击查看活动概况

前言

之前的文章对build.dart 怎么生成的做了一个简略剖析,现在build.yaml配置参数现已经过build.dart 引进到build系统中了,接下来就该依据参数履行builder了;

在榜首篇文章中简略归纳了build.dart 的履行流程,终究是由build.dart 会履行BuildRunner去履行所有builder并回来成果;那么现在就该看下BuildRunner究竟做了什么;

BuildRunner

[Flutter] Flutter 的 build 系统(三)--BuildRunner

BuilderOption

首要是配置参数部分,在这里首要构建了BuilderOption,其所需的参数中除了一些bool开关之类的简略配置外,就只有三个部分:packageGraphoveridBuildConfigresolvers

其间packageGraph在前面文章中经常见了,依据pubspec.yaml而生成的依赖有向图;

overidBuildConfig也是打过招呼的部分,是依据build.yaml生成的BuildConfigMap;

resolvers这个还没介绍过,看注释,其作用是生成BuildStep,在这里先越过,这个BuildStep里边又搞出好几个新东西,后边一起看;

[Flutter] Flutter 的 build 系统(三)--BuildRunner

BuilderOption 的创立是经过其create办法,其办法中会先创立TargetGraph,之后给resolver分配个兜底值(AnalyzerResolvers),终究组合起来;

而这个TargetGraphPackageGraph的区别是,PackageGraph 是依据pubspec.yaml生成的;而TargetGraph是在PackageGraph基础上,运用overridBuildConfig掩盖之后生成的;这也是其forPackageGraph办法中需求的两个参数;

[Flutter] Flutter 的 build 系统(三)--BuildRunner

defaultRootPackageSources是默许的source列表;

[Flutter] Flutter 的 build 系统(三)--BuildRunner

对应BuildConfig->BuildTarget->InputSet的include变量

这个BuildConfig里边一大堆参数,终究在整个番外篇,收拾下详细跟build.yaml中哪部分对应,起什么作用?

剩下的两个,如同是模块合规性检测用的,如果有package不包括填入路径的东西,那么就提一下正告;

BuildRunner

BuildOption完成后,便是BuildRunner的创立和履行;

创立环节

createBuildPhases

BuildRunner的create办法,终究走到的部分是BuildImpl.create

[Flutter] Flutter 的 build 系统(三)--BuildRunner

首要,其间的入参前面都现已提及过了;能够直接往下走;

接下来经过_createBuildPhasesWithinCycle创立了一个名为BuildPhases的东西;BuildPhases是一个用来表述当前任务过程的类,用来承载详细要履行的builder和其终究配置,终究以一个列表的方式组合起来;

其分为InBuildPhase(只履行单个builder的过程)和PostBuildPhase(能够履行复数个builder的过程),其实分别代表的便是在build.yaml中的builderpost_process_builders这两部分;

[Flutter] Flutter 的 build 系统(三)--BuildRunner

其间寄存的参数为:

[Flutter] Flutter 的 build 系统(三)--BuildRunner

  • builder:自然便是结构器;
  • builderLabel:结构器label,不必太在意;
  • builderOptions:前面出现过;
  • generateFor:对应build.yaml中的generate_for部分;
  • package:包名;
  • targetSources:对应build.yaml中的source部分;

其生成也是在build.dart 中就区别好了,比如说这样:

[Flutter] Flutter 的 build 系统(三)--BuildRunner

如果在build.yaml中声明晰builders,那么apply办法就会经过BuilderApplication.forBuilder生成InBuildPhase

[Flutter] Flutter 的 build 系统(三)--BuildRunner

如果在build.yaml中声明晰post_process_builders,那么applyPostProcess就会经过BuilderApplication.forPostProcessBuilder生成PostBuildPhase

[Flutter] Flutter 的 build 系统(三)--BuildRunner

prepareWorkspace

这步的作用正如字面意思。对应代码是:

var buildDefinition = await BuildDefinition.prepareWorkspace(
    environment, options, buildPhases);

这一步会生成一个名为BuildDefinition的东西;其成员变量如下:

[Flutter] Flutter 的 build 系统(三)--BuildRunner

需求留意的参数中多了一个AssetGraph的东西;依照其注释的意思,应该是在build过程中用到的文件资源的依赖有向图;在这里做个序列化缓存起来;

其方位是这个:

[Flutter] Flutter 的 build 系统(三)--BuildRunner

对应部分是这些:

[Flutter] Flutter 的 build 系统(三)--BuildRunner

再之后便是查看有没有拿到这个缓存文件,拿到的话,经过AssetTracker追寻并查看一次更新,没拿到就创立并缓存起来。终究把这些信息,结合上之前的环境部分提供的reader和writer,组合起来便是BuildDefinition

SingleStepReader

这个环节,依照其注释,如同也仅仅是提供日志和追寻的东西:

[Flutter] Flutter 的 build 系统(三)--BuildRunner

FinalizedReader

这个环节如同也仅仅是忽略了删除文件,跟普通的AssetReader并无太大区别

[Flutter] Flutter 的 build 系统(三)--BuildRunner

履行环节

在创立完成之后,就轮到了调用run去真正履行的环节;

[Flutter] Flutter 的 build 系统(三)--BuildRunner

其实这步所做的事,在榜首篇中现已归纳了,说白了便是调用_safeBuild开个Zone去获取终究的履行成果,然后该缓存缓存,该收尾收尾~~~

结语

至此,build系统的根本流程就大体剖析完了

其实难点仍是搞了一大堆名字很相似的新名词…………现在感觉根本比着 build_config 来过一遍作用会好很多;