首页 > 其他分享 >rush管理monorepo理论及实践

rush管理monorepo理论及实践

时间:2024-12-27 18:30:12浏览次数:6  
标签:rush 依赖 package 实践 json libs 安装 monorepo

link : https://rushjs.io/zh-cn/pages/intro/welcome/

rush管理monorepo理论及实践

 

2021-08-07 3,735

阅读4分钟  

What is monorepo

简单来说,就是一个git仓库管理某个范围的所有代码

Why monorepo

  • 源码透明度
  • 级联发布(如babel)
  • 代码复用
  • 配置复用(可hoist到上层,子项目继承)
  • 强制沟通(如公共库只能提供最新版本,库开发者和使用者联系更紧密)
  • ...

rush

rush官方文档

简单来说,rush提供了大型仓库(如monorepo)的管理能力

同时rush支持底层使用pnpm进行包管理,解决Phantom dependency、NPM doppelgangers等问题

rush基本使用

rush init

将项目初始化为rush管理

rush update(在rush.json的目录或其任意子目录执行)
  1. 更新common/config
  2. 检查所有项目的package.json,对比仓库的common shrinkwrap文件,确定其是否有效,如果过期了则更新shrinkwrap文件
  3. 所有依赖都安装到common/temp/node_modules
  4. 最后,rush为每个项目创建一个node_modules目录,并创建symlinks软链到common/temp/node_modules

rush update可能更新lockfile,rush install则会按lockfile安装

rush update --purge(强制重新安装依赖而不是基于缓存)

什么是shrinkwrap文件(如package-lock.json)

通过在git管理的一个大文件中保存一份完整的依赖安装计划解决依赖安装的不确定性问题

rush add

安装依赖

 
rush add -p webpack --dev    // -p指定要安装的包,这里将webpack安装为子项目dev依赖
rushx

相当于npm run

rush build(在rush.json的目录或其任意子目录执行)

rush build会执行所有项目npm script中的build

pnpm基本原理

依赖文件统一提升到上层,子项目中node_modules中使用软链依赖树(参考前文中rush update的依赖安装细节)

正确的依赖树结构(相较于扁平化依赖)确保了依赖使用的安全性(如项目中引入的库一定是package.json中所声明的依赖)

同时软链到上层统一管理的依赖,可以防止依赖的重复安装

Phantom dependency

简单来说,就是代码中可以加载到未在package.json中声明的依赖库

如A依赖B、C,同时B、C都依赖D

则npm会进行依赖扁平化来复用D,即安装后为B、C、D都在A的node_modules下最外层

现在A中可以直接依赖D,虽然D不在A的package.json声明的依赖中

影子依赖带来的具体问题
  • 不兼容的版本

假设我们的代码依赖了A并指定为^3,A中依赖了B

当我们的代码直接引入B时,B的具体版本我们将一无所知,因为B的版本完全由A的开发者控制

假设A进行了一个patch升级,则仍符合我们指定的版本范围,但如果A中对B的版本指定为主版本的升级版本,则可能导致我们代码中引入的B出现不兼容

  • 依赖丢失

假设我们作为库lib的开发者,lib中有一个dev依赖为A,A中依赖了B

当我们在代码中使用了B并发布出去,使用方install lib时不会安装lib的dev依赖,即不会安装A,则A的依赖B自然也不会安装

此时我们的库由于无法引入B而出现异常

同时,由于扁平化依赖的原因,可能使用方在安装其他库时也隐式安装了B,导致我们的库虽然缺失了B的依赖声明仍能正常工作

NPM doppelgangers

四个依赖A、B、C、D,其中A、B依赖E@1,C、D依赖E@2

则可能的情况为

  • 先扁平化安装了E@1,则C和D的node_modules中都会安装E@2
  • 先扁平化安装了E@2,则A和B的node_modules中都会安装E@1

影响

  • 重复安装依赖(影响安装速度和磁盘空间)
  • 影响打包体积(重复包都会打进来)
  • 可能破坏三方库内部的单例模式(E中可能有些逻辑依赖单例,而重复的E被依赖时可能分别引入不同的实例)
  • ts类型冲突
  • ...

子项目间依赖

依赖方dependencies里指定workspace:*(pnpm提供workspace协议)

如子项目app依赖子项目libs,则在app的package.json中

 
"dependencies": {

    "libs": "workspace:*"

}
构建产物依赖

前置build libs

 
rush build -T .    // -T .表示构建当前子项目所有依赖项目(排除自身)

libs的package.json中main指向产物入口

 
{

    "main": "./dist/main.js"

}

app引入libs时和普通三方库一致即可

源码依赖(两种方式)
  • libs的package.json中main字段指定包入口,app直接引入

libs的package.json

 
{

    "main": "./src/index.js"

}

app中引入

 
import * as libs from 'libs'
  • 直接用相对路径引入
 
import * as libs from '../../libs/src'

标签:rush,依赖,package,实践,json,libs,安装,monorepo
From: https://www.cnblogs.com/gaoyanbing/p/18636518

相关文章

  • 【C++面向对象——类与对象】CPU类(头歌实践教学平台习题)【合集】
    目录......
  • BitBake 执行流程深度解析:从理论到实践
    BitBake是嵌入式Linux系统开发中一个不可或缺的任务执行引擎,尤其在Yocto项目中担任核心角色。它通过解析元数据、管理任务依赖以及调度构建任务,为开发者提供了一套高度模块化、灵活且高效的工具链支持。然而,BitBake的执行流程不仅仅局限于菜谱工作流,而是构建了一个通......
  • 【启智社区】【大语言模型原理与实践】1.大语言模型的发展
    大语言模型(LargeLanguageModels,LLM)是一种由包含数百亿以上权重的深度神经网络构建的语言模型,使用自监督学习方法通过大量无标记文本进行训练。自2018年以来,包含Google、OpenAI、Meta、百度、华为等公司和研究机构都纷纷发布了包括BERT、GPT等在内多种模型,并在几乎所有自然语言处......
  • K-means算法分析与实践
    一、聚类分析概述定义:根据“物以类聚”原理,将本身尚未归类的样本根据多个维度(属性)聚集成不同的组,这样的一组数据对象的集合叫做簇或群组。经过聚类划分后的群组特性目标:属于同一群组的样本之间彼此足够相似;属于不同群组的样本应该足够不相似;聚类与分类的区别:聚类没......
  • php中laravel基于rabbit的异步队列实践与原理
    在Laravel中,RabbitMQ是一个常用的消息队列服务,它可以用于异步任务处理。Laravel默认支持多种队列驱动,其中就包括RabbitMQ。通过RabbitMQ,你可以实现高效、可靠的消息传递和任务处理,尤其适用于需要分布式系统或者高并发的场景。以下是基于RabbitMQ的Laravel异步队列的......
  • PHP语言laravel框架中基于Redis的异步队列使用实践与原理
    在Laravel中,基于Redis的异步队列是通过Laravel的队列系统与Redis服务结合来实现的。这种队列机制允许你将任务推送到队列中,并由后台工作进程异步处理这些任务。这样,你就可以将耗时的操作(如发送邮件、处理视频、数据同步等)推迟到后台处理,从而提高应用的响应速度。###1......
  • 15条 Karpenter 最佳实践,轻松掌握弹性伸缩
    Karpenter是一款高性能、灵活的开源Kubernetes集群自动扩展工具,目前已支持AWS和阿里云。它可以根据不断变化的应用负载,快速启动大小合适的计算资源,进而提升应用的可用性。相较于ClusterAutoscaler,Karpenter的灵活、易用、细粒度控制和高度自动化是一项重大升级,可帮助您更......
  • 复盘如何更高效?在线协同工具的实践价值
    在医疗行业,销售团队的日常工作充满了挑战:客户信息庞杂、业务场景复杂、沟通链条较长,复盘效率低下往往成为团队发展的阻碍。然而,复盘作为提升销售流程优化的重要环节,却常常被忽视。随着在线协同编辑工具的不断迭代升级,这一局面正在被改写。医疗销售中的复盘难点医疗销售复盘通常......
  • 鸿蒙OS创新实践:动态声控话筒开发指南
    前言在鸿蒙OS的生态中,开发者们不断探索和创新,以期为用户带来更丰富的交互体验。最近,我萌生了一个想法:制作一个能够随着声音动态变化的话筒组件。尽管网络上缺乏现成的参考案例,但我决定亲自动手,将这一创意变为现实。本文将深入解析这一开发过程,分享我的实战经验和技术细节。一、......
  • linux 点对点语音通话及直播推流实践一: linux USB声卡或耳机 基本配置
    inuxUSB声卡或耳机基本配置工具安装查看设备录放音操作录音放音声音配置获取控制信息音量配置本文介绍linux下alsa声音原件工具使用方法,包括设备查询、声卡基本配置、录音放音等。保证alsa套件可正常操作和配置声卡,是实现SIP语音通话、音视......