• yarn多级包依赖不同版本的组件,最终到底会怎么安装?


    一、背景

    在开发项目的时候,偶然间发现一个现象:

    项目依赖packageA和packageB,而packageB也依赖packageA。正常来说,我们理解到的是只需要在项目依赖中安装packageA就可以了,packageB会直接使用项目中已安装的packageA。那么事实真的是这样么???

    如下图:

    显然不是我们想象的那样,我们发现在 packageB下也安装了packageA,这是为什么呢,当时是觉得不太理解。经过调研后,发现项目的packageA的版本是0.3.0,而packageB依赖的packageA版本却是0.4.0版本,在向上找的时候,发现版本并不匹配,所以只能够自己进行安装.

    简单的举个不恰当的例子:你参加运动会需要穿运动鞋,但是这个时候你没有运动鞋,可是你发现你的室友有运动鞋,你想去穿她的,发现她的鞋子是36的或者38的,而你是37的脚,所以这个时候你就只能自己买一双37码的鞋子;如果她的鞋子刚刚好是37的,那么你就不需要自己买鞋子而直接穿她的就可以。不知道这样举例子,大家能不能听得明白,emm~

    二、yarn版本安装多种场景详解

    场景一:

    packageA@1.0.0 依赖 packageB@1.0.0

    结论:由于npm是扁平化管理,所以packageA和packageB会安装到同一层级

     场景二:

    packageA@1.0.0 依赖 packageB@1.0.0,packageC@1.0.0 依赖 packageB@2.0.0

    结论:由于根目录下已存在 packageB@1.0.0,所以npm 会把packageB@2.0.0 安装到 packageC 依赖的 node_modules 里。

    场景三:

    packageA@1.0.0 依赖 packageB@1.0.0,packageC@1.0.0 依赖 packageB@2.0.0。安装 packageD@1.0.0,而它也依赖 packageB@2.0.0

    结论:同样的,由于根目录下已存在 packageB@1.0.0 的依赖,所以npm会把packageB@2.0.0 安装到 packageD@1.0.0 依赖的 node_modules里。

     场景四:

    在场景三的基础上,我们再安装 packageE@1.0.0,它依赖 packageB@1.0.0

    结论: 由于顶级的node-mudules中已经安装了packageB@1.0.0,所以会跳过安装,直接使用

    场景五:

    如果更新 packageA@1.0.0为packageA@2.0.0,同时它依赖是 packageB@2.0.0。

    结论: npm的执行顺序是,删除 packageA@1.0.0,安装 packageA@2.0.0,并在packageA下安装packageB@2.0.0,留下了 packageB@1.0.0 在顶层目录

     场景六:

    如果在上述基础上,更新 packageE@1.0.0为 packageE@2.0.0,同时它依赖packageB@2.0.0。

    结论:那么 npm的执行顺序是,删除 packageE@1.0.0,安装packageE@2.0.0,删除 packageB@1.0.0,安装packageB@2.0.0

     

    由上图可以看出来,存在四个packageB@2.0.0,并且分布在不同的node-modules中,按照我们上面说的,这个时候应该只需要留有顶层node-modules中的packageB@2.0.0就可以了。那么为什么会出现上图这种结构呢?这是由于npm顺序执行的问题造成的,这时候如果你把node-modules删掉,重新进行安装,你就会得到非常清晰的结构,如下图:

     

    本篇文章到这里就结束啦,欢迎留言讨论~

  • 相关阅读:
    2.7 Time Series
    图像分割 - Hough变换圆环检测
    深度学习——day19 读论文:基于改进 Sigmoid 卷积神经网络的手写体数字识别(2021 信息科技)
    java计算机毕业设计桂林恒保健康防护有限公司官网MyBatis+系统+LW文档+源码+调试部署
    基于遥感大数据的信息提取技术综述
    影像组学提取特征,图像标签尺寸不一致
    fastjson 1.2.24 反序列化导致任意命令执行漏洞
    【Git企业开发】第一节.Git 初识
    百度echart的几种动画写法
    Android 架构MVI、MVVM、MVC、MVP
  • 原文地址:https://blog.csdn.net/rolinabc/article/details/127688884