3.1 yarn源码结构及运行流程
本章开始正式进入源码的学习
本文发布于掘金专栏
文章原文位于github
源码结构
源码文件都位于src目录下,下面是src目录下的文件内容
其中的文件或文件夹的作用如下
-
cli
cli文件夹是运行命令的主要文件夹,其中的
commands文件夹里面放的是每一个命令执行的具体代码。这些命令被commands/index.js导出,每一个命令都会导出一个run函数,这个函数是每个命令执行到命令具体内容的入口函数,比如yarn list的list命令的实现就在commands/list.js里面的main函数里面。commands/index.js里面导出的是一个对象,key为命令名字,value是对象,其中这个对象有run等属性,这里的run属性就是指向的运行命令时执行的函数,还有一些属性比如setFlags留到下面讲main函数的时候继续讲。 -
fetchers
这个文件夹是
yarn获取包来源的函数,主要有tarball-fetcher以及git-fetcher等,这个以后也会详细讲。 -
lockfile
和
yarn.lock文件相关的操作 -
registries
和npm源有关的代码。这个以后也会详细讲
-
reporters
和
yarn的输入输出有关的代码。最重要的是ConsoleResporter以及JsonResporter。ConsoleResporter输出到标准输出,JsonResporter输出到一个json文件。 -
resolvers
寻找
npm包的来源,以后会详细讲 -
util
工具文件夹,里面的实现都很底层
剩下的文件以表格展示
| 文件名 | 作用 |
|---|---|
| api.js | 这是一个空文件 |
| config.js | 这个文件和yarn的内部设置有关 |
| constants.js | 这是放常量的文件 |
| error.js | 有错误有关 |
| hoisted-tree-builder.js | 和yarn audit命令有关,用于生成audit需要的树结构 |
| integrity-checker.js | 用于检测文件的完整性,yarn.lock文件里面有integrity属性 |
| package-compatibility.js | 兼容性检测,检测package.json里面的Cpu,Platform,以及Engines字段 |
| package-constraint-resolver.js | 用于获取具体的版本号 |
| package-fetcher.js | 和fetchers有关 |
| package-hoister.js | 和yarn audit树有关 |
| package-install-scripts.js | 运行yarn script时有关的代码 |
| package-linker.js | 和link相关文件有关,yarn的link不止指的yarn link命令,而是和复制最后的文件到目标路径有关 |
| package-reference.js | 抽象的一个package的代码 |
| package-request.js | 和包tarball文件的请求有关 |
| package-resolver.js | 和resolvers有关 |
| rc.js | yarn自己的配置文件yarn.rc文件相关代码 |
| resolution-map.js | 和resolution有关 |
| types.js | flow类型 |
| workspace-layout | 和workspace有关 |
运行的整体概述
这里先给出总体的运行流程图
总体就是进入main函数然后初始化几个全局的配置项,然后从commands对象中找到对于命令取出run函数进行运行。
查看并调试src/cli/index.js代码,这是运行yarn的一个入口的文件,文件里面主要有start函数以及main函数。
start函数
start函数的内容很短,这里给出伪代码
if (exit(.yarnrc) && .yarnrc[yarnpath]) { // 如果.yarnrc文件存在而且文件中配置了yarnpath
spawn(yarnpath); // 新开一个子进程去执行对应yarn路径下的yarn
} else {
main();
}
start函数提供了一种方式可以执行任意路径下的yarn分发版
main函数
main函数主要初始化了几个配置项并找到对应的command的run函数进行运行。
主要做了以下几件事
-
初始化
commander,这是读取命令行的一个工具,可以设置参数等,使用的是开源的commander。除了设置全局的参数,还会根据不同的command设置不同的command参数,这是根据每个命令文件中导出的setFlags函数来实现的。 -
初始化
reporter,默认是ConsoleReporter会把yarn的输出输出到标准输出,如果在运行yarn的时候加了--json,会使用JsonReporter,会输出到一个json文件。 -
初始化
Config,yarn的Config比较复杂这里后面讲 -
从
commands中取出command的run函数执行,到了这里就进入到命令的具体实现,其中run函数的调用参数为
command.run(config, reporter, commander, commander.args)
下面是调用command.run时的调用栈及其变量
总结
本章说明了yarn的源码的基本目录结构以及yarn运行的基本流程,本章中遗留了很多新的东西比如Config以及Resolver没有讲在接下来的文章中会具体讲解。
author: xiaochuan
date: 2024.12.26