yarn源码结构及运行流程

228 阅读4分钟

3.1 yarn源码结构及运行流程

本章开始正式进入源码的学习

本文发布于掘金专栏

文章原文位于github

源码结构

源码文件都位于src目录下,下面是src目录下的文件内容

源码结果

其中的文件或文件夹的作用如下

  1. cli

    cli文件夹是运行命令的主要文件夹,其中的commands文件夹里面放的是每一个命令执行的具体代码。这些命令被commands/index.js导出,每一个命令都会导出一个run函数,这个函数是每个命令执行到命令具体内容的入口函数,比如yarn listlist命令的实现就在commands/list.js里面的main函数里面。

    commands/index.js里面导出的是一个对象,key为命令名字,value是对象,其中这个对象有run等属性,这里的run属性就是指向的运行命令时执行的函数,还有一些属性比如setFlags留到下面讲main函数的时候继续讲。

    commands对象的内容

  2. fetchers

    这个文件夹是yarn获取包来源的函数,主要有tarball-fetcher 以及git-fetcher等,这个以后也会详细讲。

  3. lockfile

    yarn.lock文件相关的操作

  4. registries

    和npm源有关的代码。这个以后也会详细讲

  5. reporters

    yarn的输入输出有关的代码。最重要的是ConsoleResporter以及JsonResporterConsoleResporter输出到标准输出,JsonResporter输出到一个json文件。

  6. resolvers

    寻找npm包的来源,以后会详细讲

  7. 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.jsyarn自己的配置文件yarn.rc文件相关代码
resolution-map.js和resolution有关
types.jsflow类型
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函数主要初始化了几个配置项并找到对应的commandrun函数进行运行。

主要做了以下几件事

  • 初始化commander,这是读取命令行的一个工具,可以设置参数等,使用的是开源的commander。除了设置全局的参数,还会根据不同的command设置不同的command参数,这是根据每个命令文件中导出的setFlags函数来实现的。

  • 初始化reporter,默认是ConsoleReporter会把yarn的输出输出到标准输出,如果在运行yarn的时候加了--json,会使用JsonReporter,会输出到一个json文件。

  • 初始化ConfigyarnConfig比较复杂这里后面讲

  • commands中取出commandrun函数执行,到了这里就进入到命令的具体实现,其中run函数的调用参数为

command.run(config, reporter, commander, commander.args)

下面是调用command.run时的调用栈及其变量

command.run时的调用栈及其变量

总结

本章说明了yarn的源码的基本目录结构以及yarn运行的基本流程,本章中遗留了很多新的东西比如Config以及Resolver没有讲在接下来的文章中会具体讲解。

author: xiaochuan

date: 2024.12.26