询问yarn工作区两类添加依赖命令的执行结果是否存在差异
两种Yarn工作区依赖安装操作的结果差异对比
核心结论
两种操作在绝大多数常规开发场景下不存在可感知的执行结果差异,仅在特定边缘配置场景下存在细微区别。
两种操作的底层执行逻辑
- 根目录执行
yarn workspace SOME-PACKAGE add some-dep的流程:Yarn从当前根工作区出发,根据根目录package.json的工作区配置,定位到package.json中name字段为SOME-PACKAGE的包路径,将该包作为执行上下文,触发add命令的依赖安装流程 - 进入子包目录执行
yarn add some-dep的流程:Yarn从当前所在的子包目录向上遍历,定位到全局的工作区根配置,识别当前路径所属的子包,将该包作为执行上下文,触发add命令的依赖安装流程
无差异的常规场景
以下场景下两种操作的输出完全一致:
- 依赖写入的目标文件相同:都会将
some-dep的版本、依赖范围写入到SOME-PACKAGE自身的package.json文件中,不会错误写入根目录的package.json - 依赖安装规则相同:都会遵循工作区全局的依赖提升、依赖软链规则,按照Yarn配置的nodeLinker模式完成依赖的软链/物理拷贝,依赖解析结果完全一致
- 锁文件生成规则相同:都会按照统一的依赖解析算法生成一致的
yarn.lock条目,不会因为执行位置不同产生重复锁项、版本偏移的问题
存在细微差异的边缘场景
两类场景下两种操作的执行结果会出现偏差:
- 本地配置读取范围不同:Yarn的配置读取逻辑是从命令执行的当前目录向上逐层查找
.yarnrc/.yarnrc.yml配置文件。从根目录执行workspace命令时,仅会读取根目录层级的Yarn配置;手动进入子目录执行命令时,会额外读取子目录路径下所有层级的配置——如果子目录路径下存在独立的Yarn配置(比如自定义镜像源、特殊的nodeLinker设置),两种操作会因为配置加载范围不同产生安装结果差异 - 包定位逻辑不同:
yarn workspace SOME-PACKAGE的定位依据是包package.json内声明的name字段,和包实际所在的目录名无关,属于精准匹配;手动进入目录执行的定位依据是当前终端所在路径,和目录里声明的包名无关,属于路径匹配。如果终端因为路径输错进入了同层级的相邻包目录,手动执行的yarn add会毫无察觉地把依赖装到错误的包里,而根目录的workspace命令不受这类路径偏差的影响
实操提示:日常开发优先使用根目录下的
yarn workspace 包名 add 依赖写法,这种方式不受终端当前路径影响,可避免进错目录装错依赖的问题;只有需要触发子目录层级的自定义本地Yarn配置时,再手动进入子包目录执行操作。
内容的提问来源于stack exchange,提问作者Peter_101
相关产品推荐
相关产品推荐

