携手创作,共同生长!这是我参与「日新计划 8 月更文应战」的第3天,点击查看活动概况
前言
之前的文章对build.dart 怎么生成的做了一个简略剖析,现在build.yaml配置参数现已经过build.dart 引进到build系统中了,接下来就该依据参数履行builder了;
在榜首篇文章中简略归纳了build.dart 的履行流程,终究是由build.dart 会履行BuildRunner去履行所有builder并回来成果;那么现在就该看下BuildRunner究竟做了什么;
BuildRunner
BuilderOption
首要是配置参数部分,在这里首要构建了BuilderOption,其所需的参数中除了一些bool开关之类的简略配置外,就只有三个部分:packageGraph
、overidBuildConfig
、resolvers
;
其间packageGraph
在前面文章中经常见了,依据pubspec.yaml而生成的依赖有向图;
overidBuildConfig
也是打过招呼的部分,是依据build.yaml生成的BuildConfig
Map;
resolvers
这个还没介绍过,看注释,其作用是生成BuildStep
,在这里先越过,这个BuildStep里边又搞出好几个新东西,后边一起看;
BuilderOption 的创立是经过其create
办法,其办法中会先创立TargetGraph
,之后给resolver分配个兜底值(AnalyzerResolvers
),终究组合起来;
而这个TargetGraph
跟PackageGraph
的区别是,PackageGraph 是依据pubspec.yaml生成的;而TargetGraph是在PackageGraph基础上,运用overridBuildConfig掩盖之后生成的;这也是其forPackageGraph
办法中需求的两个参数;
defaultRootPackageSources
是默许的source列表;
对应BuildConfig
->BuildTarget
->InputSet
的include变量;
这个BuildConfig
里边一大堆参数,终究在整个番外篇,收拾下详细跟build.yaml中哪部分对应,起什么作用?
剩下的两个,如同是模块合规性检测用的,如果有package不包括填入路径的东西,那么就提一下正告;
BuildRunner
BuildOption完成后,便是BuildRunner
的创立和履行;
创立环节
createBuildPhases
BuildRunner的create办法,终究走到的部分是BuildImpl.create
首要,其间的入参前面都现已提及过了;能够直接往下走;
接下来经过_createBuildPhasesWithinCycle
创立了一个名为BuildPhases
的东西;BuildPhases
是一个用来表述当前任务过程的类,用来承载详细要履行的builder和其终究配置,终究以一个列表的方式组合起来;
其分为InBuildPhase
(只履行单个builder的过程)和PostBuildPhase
(能够履行复数个builder的过程),其实分别代表的便是在build.yaml中的builder
和post_process_builders
这两部分;
其间寄存的参数为:
- builder:自然便是结构器;
- builderLabel:结构器label,不必太在意;
- builderOptions:前面出现过;
- generateFor:对应build.yaml中的
generate_for
部分; - package:包名;
- targetSources:对应build.yaml中的
source
部分;
其生成也是在build.dart 中就区别好了,比如说这样:
如果在build.yaml中声明晰builders
,那么apply
办法就会经过BuilderApplication.forBuilder
生成InBuildPhase
;
如果在build.yaml中声明晰post_process_builders
,那么applyPostProcess
就会经过BuilderApplication.forPostProcessBuilder
生成PostBuildPhase
;
prepareWorkspace
这步的作用正如字面意思。对应代码是:
var buildDefinition = await BuildDefinition.prepareWorkspace(
environment, options, buildPhases);
这一步会生成一个名为BuildDefinition
的东西;其成员变量如下:
需求留意的参数中多了一个AssetGraph
的东西;依照其注释的意思,应该是在build过程中用到的文件资源的依赖有向图;在这里做个序列化并缓存起来;
其方位是这个:
对应部分是这些:
再之后便是查看有没有拿到这个缓存文件,拿到的话,经过AssetTracker追寻并查看一次更新,没拿到就创立并缓存起来。终究把这些信息,结合上之前的环境部分提供的reader和writer,组合起来便是BuildDefinition
SingleStepReader
这个环节,依照其注释,如同也仅仅是提供日志和追寻的东西:
FinalizedReader
这个环节如同也仅仅是忽略了删除文件,跟普通的AssetReader并无太大区别
履行环节
在创立完成之后,就轮到了调用run去真正履行的环节;
其实这步所做的事,在榜首篇中现已归纳了,说白了便是调用_safeBuild
开个Zone去获取终究的履行成果,然后该缓存缓存,该收尾收尾~~~
结语
至此,build系统的根本流程就大体剖析完了
其实难点仍是搞了一大堆名字很相似的新名词…………现在感觉根本比着 build_config 来过一遍作用会好很多;