选型 monorepo 后,并不是无脑的按照其指导来全部切换,为了更平稳过度,我们规划了以下几步: 第一步:采用 yarn workspace 来解决依赖问题(npm install ...比 yarn link 更好的机制,因为它只影响工作区树而不是整个系统(yarn link 会在全局/usr/local/bin 中增加相关记录,[见下述](###yarn link) 所有的项目依赖项将一起安装...代码中对于 fusion-charts 等引用要使用 /workspace-a/package.json#name 字段(上述,name 字段为 fusion-charts),而不是文件夹名称 charts...通过将子模块提升到其父项目的node_modules:monorepo/node_modules来在子项目/程序包之间共享模块。...nohoist 禁止将选定的模块提升到项目根目录 "workspaces": { "packages": ["packages/*"], "nohoist": ["**/react-native
它通过高效的依赖共享机制,将多个相关的包集中管理,实现了更快速、更节省空间的依赖安装和执行。...其主要功能包括将本地修改的软件包快速发布到本地 registry,并在其他项目中进行引用,以及支持在 Monorepo 中进行快速本地迭代,提高开发效率。...通过符号链接进行高效的依赖管理。 1、高效的依赖管理 2、易于上手 1、功能相对比较单一 2、需要适应符号链接的概念 「Yalc」 允许在不发布到npm仓库的情况下共享本地包,适用于本地开发和测试。...1、本地包共享方便 1、可能不适用于所有场景,特别是在需要发布到公共npm仓库时 「npm Workspaces」 npm的一部分,提供了在Monorepo中管理包的功能。...相比之下,Pnpm 的依赖树结构更符合常规认知,整个依赖关系更加透明和可控。因此,最终我们决定选择 Pnpm 作为 Monorepo 项目的依赖管理工具。
答案就是 Monorepo! 在字节跳动内部的百科词条中对于 Monorepo 的定义如下: Monorepo 是一种将多个项目代码存储在一个仓库里的软件开发策略。...目前来讲,Lerna 作为 JavaScript项目的多包管理器,已经是比较成熟,并已被现代企业所验证,因此接下来将逐步搭建一个基于 Lerna[1] 的 Monorepo 管理环境,希望可以帮助大家在各司业务中落地并实现降本提效...根据笔者经验,Monorepo 将显著提升开发人员的愉悦度,所以赶紧搞起来吧!...package 进行构建 无效依赖:每次发包都会安装所有 package 的依赖项 幽灵依赖:Phantom dependencies[2] 在依赖提升(hoist)后更加明显 这里将问题罗列出来,不是说...2.2 Lerna + Yarn Workspaces Lerna 默认会使用 NPM 作为包管理器,但使用 yarn 作为 Lerna 的默认包管理器是更推荐的方式。
基于 Monorepo 的出现,我们可以更多的业务层面的分离而不需要分离时随之而来冗余繁琐的项目依赖问题。我们可以基于一个仓库下共享多个应用程序之间的配置和依赖。...你可以将 Lerna 管理的项目理解成为一个大的文件夹,其中每一个文件夹中都会包含一个独立的应用程序文件夹。...通过内容生成 Hash 甄别文件变动 Turborepo 检查文件内容变动时,会根据内容生成 Hash 来对比,而不是粗略的利用时间戳来确定需要构建的内容。...但 TurboRepo 开发团队提供了一项名为“云缓存”的功能,它支持将本地 turborepo 链接到远程缓存从而实现多人合作时共享缓存。...而不是类似于上文提到 Lerna 中仅机器化的支持单个任务的运行。
multirepo 指的是将模块分为多个仓库,monorepo 指的是将多个模块放在一个仓库中。...monorepo 可以让多个模块共享同一个仓库,因此他们可以共享同一套构建流程、代码规范也可以做到统一,特别是如果存在模块间的相互依赖的情况,查看代码、修改bug、调试等会更加方便,因此也越来越受到大家的关注...最早是 Babel 自己用来维护自己的 monorepo 并开源出的一个项目,针对使用 git 和 npm 管理多软件包代码仓库的工作流程进行优化,解决多个包互相依赖,且发布需要手动维护多个包的问题。...yarn workspaces 与 lerna yarn workspaces 是 yarn 提供的 monorepo 的依赖管理机制,用于在代码仓库的根目录下管理多个 package 依赖,与 lerna...这类包一般都是一些开发依赖,比如将 ts 代码转换成 es5 代码或者一些代码校验工具等。通过这种方式安装的依赖包是装在根目录下的 node_modules 中。
,而不是作为外部依赖被安装。...另外,发布过程还可以通过 npm publish 命令的 --tag 参数动态配置。 workspaces workspaces字段用于定义 monorepo 结构中的多个 package。...❝启用 workspaces 后,在根目录运行类似npm install、npm run build等命令,会自动在所有 workspace 包中生效。...❞ workspaces的常见使用场景: 管理多个相关的包,让它们使用同一个git仓库和配置 共享依赖以优化安装大小 统一管理命令和脚本配置 与普通的多包管理相比,workspaces 可以减少重复工作...现在,如果在根目录中运行 npm run lint --workspaces --if-present,它将在所有具有 lint 脚本的工作空间中运行 lint 脚本。
使用 peerDependencies 的主要目的是确保在整个项目中使用相同版本的某个包,以防止出现不一致的依赖关系导致的问题。这有助于确保包之间的协同工作,并降低由于版本不一致而引起的潜在问题。...,而不是作为外部依赖被安装。...另外,发布过程还可以通过 npm publish 命令的 --tag 参数动态配置。 workspaces workspaces字段用于定义 monorepo 结构中的多个 package。...启用 workspaces 后,在根目录运行类似npm install、npm run build等命令,会自动在所有 workspace 包中生效。...workspaces的常见使用场景: 管理多个相关的包,让它们使用同一个git仓库和配置 共享依赖以优化安装大小 统一管理命令和脚本配置 与普通的多包管理相比,workspaces 可以减少重复工作,大幅简化
需要提示大家,monorepo作为一种代码管理策略,并不是新生事物,已经有20年以上的历史了,最初这种策略的名字叫shared codebase,只不过以monorepo这个称呼闻名于世。...反之如果开发者独立维护一个项目,对该项目重构后,是不是能在整个系统中正常运转很难去验证。...优势5:便于跨团队协作 比如团队A维护项目一,而团队B用到了项目一提供的能力,因为代码共享,可以及时跟踪项目一中的具体代码,甚至对该项目中的代码提供改进意见。...比如存在下面的错误认识:"monorepo就是yarn提供的workspace"、"monorepo就是yarn和lerna的组合"等等。monorepo是一个策略,是一种思想,而不是一个具体的工具。...基于这个认识,我们就不难理解将一个策略落地,可以有多种方案。而本文将会由不断将方案进行增强演进,最终得出两个管理monorepo类型项目的优良方案。
而且,随着时间的推移,代码的耦合度会变得越来越高,代码会越来越脆弱,越来越难维护。 “Monorepo 结构”是一个有趣的折衷方案:在共享存储库的同时将代码库分割成包。...Node.js 项目和依赖的配置:package.json (包括 npm/yarn 脚本)将被拆分:主脚本在根目录,然后每个包里有一个。...为了使包可以作为其他包的依赖项导入(也就是 workspaces),我们建议使用 Yarn 3 或其他支持工作空间的包管理器。...从现在起,该存储库可以正式称为“Monorepo”了!所有开发人员都应该能够创建自己的包,并在单体中导入它们,而不是直接向其中新增代码。...小 结 我们已经把一个单体 Node.js 后端变成了 Monorepo,同时将对团队的影响和风险降到最低: 将单体拆分为多个相互依赖的、解耦的包; 跨包共享通用 TypeScript、ESLint
最近我用 Yarn 包管理工具实践了一次 Monorepo 的工程化搭建,此文意在将实践过程分享出来并说说我对 Monorepo 的一些看法,仅供参考。...,如 eslint、prettier 配置等 不同模块间有一个良好的目录隔离 引入 Yarn 首选参照 yarn 官网在全局安装: npm i -g yarn 并在仓库根目录中引入指定版本的 yarn:...* 类型包排除 通过 yarn ws:dev/dist 可以本地一键编译所有包 使用体验 依赖管理 Yarn 是个包管理器,最核心的实现就是依赖安装,其特性建议细看文档这里简单带过: Offline Cache...Monorepo 的一些经验之谈。...参考 JavaScript 包管理器简史(npm/yarn/pnpm)https://mp.weixin.qq.com/s/0Nx093GdMcYo5Mr5VRFDjw 为什么现在我更推荐 pnpm 而不是
Yarn只使用唯一的yarn.lock文件,而不是每个项目都有一个package-lock.json,这能降低很多潜在性的冲突。 lerna bootstap会重复安装相同的依赖项。...这里根目录 tsconfig.json 的paths是这里的神奇之处:它告诉 TypeScript 编译器,每当一个模块尝试从 monorepo 导入另一个模块时,它都应该从 packages 文件夹中解析它...具体来说,它应指向该包的 src 文件夹,因为这是构建时将编译的文件夹。除此之外,在 IDE 点击依赖包的方法,就会跳转对应的源代码。...run build" } } 而这个方案下,lerna run将像以前一样工作,所以这个解决方案的主要优点是它允许我们调试包的构建而不用担心其他包。...注:文中使用的 CI 是腾讯内部开源的 Orange CI,但万变不离其宗,利用 CI 去发布 npm 包的核心要义是,把 CI 模拟为本地环境,编写脚本完成构造、更新版本标签、发布 npm 这一流水线
Multi-repo:则是通过建立多个仓库,每个仓库包含拆分好的代码工程,而仓库间的调用共享则是通过NPM或者其他代码引用的方式进行。...这使得更多开发人员将工具代码单独成库并发布成包,并将庞大的业务进行拆分,每个业务模块建立单独的库由各自团队负责开发以及维护,各种包都通过npm来进行共享。...当然,上面的问题在Google,Facebook等实践中都有相应的技术团队提供解决方案和支持,但不是每个公司或者团队都能拥有这些大厂的支撑能力,因此,未来还需要更多通用的解决方案来帮助完善整个Monorepo...而使用monorepo的功能,仅仅需要在根目录创建一个pnpm-workspace.yaml文件,并填写需要管理的目录,而之后这些目录将自动纳入pnpm的工作空间,并由它进行管理。...,这里将全局安装pnpm: npm install pnpm -g 并在根目录的package.json中添加如下脚本来限制包的安装: // 此行命令将限制使用 pnpm 来进行 install
什么是 Yarn workspace Yarn workspace 是 Yarn 提供的 monorepo 下,管理依赖的机制。...对代码仓库下,多个 package 的依赖,进行管理:将共同的依赖,做 hosting(提升)。这样,可以防止 package 中的包重复安装。..."workspaces": ["packages/*"] } 配置项含义: private - 禁止发布根目录内容 workspaces - 设置工作区,声明 workspace 中 package 的路径...该命令的作用,是 cd 到 package 文件夹下的每个子文件夹,运行npm install或yarn install,在子文件夹中生成版本lock文件和node_module,单独对依赖进行管理。...好处 减少项目的磁盘占用空间Yarn 将项目中的共同依赖,提升到根目录下进行安装 自动设置软链接,方便调试Yarn 的 workspace 会自动对 package 的引用,设置 symlink 所有
由此可以看出Yarn的开发者其实是希望更加多的开发者参与到这个项目的开发,而不是只有他们来维护。...更好的workspaces支持 v2版本一个最大的改变就是将workspaces变成了一等公民(first-class citizen),这样就可以更好地支持monorepo的开发了。...自动发布关联的workspaces 有参与过monorepo开发的同学们一定会遇到过这样的问题:当某个包(workspace)发布了新的版本之后,发布其它相关联的包十分麻烦。...version插件允许你将一部分包版本管理工作分发给你的代码贡献者,而且它还提供了一个友好的交互界面来让你十分容易地管理关联包的发布: 在多个workspaces中运行相同的命令 在同一个项目的不同workspaces...它的具体做法是让开发者将本地的依赖包也提交到远端的git仓库中,看到这里你可能会想:“不就是将nodemodules也提交吗?这个做法很蠢吧!”。
,于是我就开始探索,有没有一种可能,可以一个仓库管理多个项目,这里说的管理是指有条理有规范的管理,而不是说硬是把几个项目蹂躏到一起。...简单地说,Yarn Workspaces是Yarn提供的monorepo的依赖管理机制,从Yarn 1.0开始默认支持,用于在代码仓库的根目录下管理多个package的依赖 实践教程 具体的教程,我觉得官网已经写的很详细了...我是这样子做架构的, 将项目一分为二,applications表示应用程序目录,里面包含了一些项目,比如企业端、资金端、平台端,以及小程序和h5等,而packages这一块的话,是我把applications...在根目录下要陪着对应包目录 "workspaces": [ "applications/*", "packages/*" ], "build": "yarn workspaces...,直接在根目录执行yarn ent dev 就可以进入开发环境了,就相当于进入子目录执行yarn dev, 然后可能你也看到了,这里的项目名不一定要跟目录名字一样的,使用@xxx是不是感觉更有仪式感一点呢
,于是我就开始探索,有没有一种可能,可以一个仓库管理多个项目,这里说的管理是指有条理有规范的管理,而不是说硬是把几个项目蹂躏到一起。...这种软件工程实践至少可以追溯到2000年代初期,当时被称为“共享代码库”。一个相关的概念是整体,但是尽管整体将其子项目合并为一个大型项目,但整体仓库可能包含独立的项目。...简单地说,Yarn Workspaces是Yarn提供的monorepo的依赖管理机制,从Yarn 1.0开始默认支持,用于在代码仓库的根目录下管理多个package的依赖实践教程具体的教程,我觉得官网已经写的很详细了...我是这样子做架构的, 将项目一分为二,applications表示应用程序目录,里面包含了一些项目,比如企业端、资金端、平台端,以及小程序和h5等,而packages这一块的话,是我把applications.../types: 通用类型包packages/styles: 通用样式包packages/hooks: 通用钩子包图片根目录下的package.json如下:{ "name": "", "version
不同于常见的每个模块都需要建一个repo。 babel的packages目录下存放了多个包。 monorepo优势 Monorepo最主要的好处是统一的工作流和代码共享。...是一个管理多个npm模块的工具,有优化维护多个包的工作流,解决多个包互相依赖,且发布需要手动维护多个包的问题。 前往lerna查看官方文档,下面做一个简易入门。...解决方案 以下操作需要保证将本地修改都git push,并且将npm registry设置为 https://registry.npmjs.org/且已经登录后。...查看效果 运行下面脚本 npm run create -- myProject 可以在当前项目根目录看到myProject的目录结构。...先来了解下使用node_modules模式的机制 将依赖包的版本区间解析为某个具体的版本号 下载对应版本依赖的tar 报到本地离线镜像 将依赖从离线镜像解压到本地缓存 将依赖从缓存拷贝到当前目录的node_modules
pnpm早在五年前就发布了第一个正式的版本,一直到现在使用的还是不多。抛开速度和安全性(并不觉得这两点是抛开npm或者yarn的重点),高效利用磁盘空间和支持monorepo是最大的特性。...如果都依赖一个相同的包,就会在各自的目录下创建node_modules文件夹。...回到pnpm对磁盘空间的高效利用(monorepo就是这点的天然产物),官网地址 : 项目初衷:节约磁盘空间并提升安装速度 使用pnpm的开源项目还是蛮多的: https://pnpm.io/workspaces...看来使用pnpm并没有像官网说的那样直接平替npm、yarn。又或者说pnpm专门为了monorepo而生?...最后,并不是不想拥抱新的技术,只是在我个人感受来说,yarn、npm现在的各种缺点我完全是能接受的,磁盘空间?对我来说,我的项目不会多到需要优化磁盘空间。
monorepo 的目标是提高模块之间共享的代码量,并更好地预测这些模块如何一起通信(例如在微服务架构中)。...common,其中一些代码将在 app 和 server 之间共享。 设置项目之前的唯一要求是在机器上安装 yarn。 Yarn 与 npm 一样,是一个程序包管理器,但性能更好,功能也略多。...要设置它们中的每一个,我们既可以使用 yarn init(在每个文件夹中),也可以手动创建文件(例如,通过 IDE)。 软件包名称使用的命名约定是在每个软件包之前都使用 @my-app/* 作为前缀。...文件 在本教程中,common 软件包将非常简单。首先,从添加新文件夹开始: src/ 文件夹,包含包的代码。...在我们的案例中,我们希望有一个可以运行 Node.js 应用程序的环境。 WORKDIR 设置容器中的当前工作目录。 COPY 将文件或文件夹从当前本地目录(项目的根目录)复制到容器中的工作目录。
本文属于第三种,从 Android 与 IOS 的开发故事说明了 Monorepo 的重要性。 笔者之所以选择这篇文章,不是因为其故事写的好,而是认可这种具有普适性的解决思路。...毕竟 Lerna 作为 Monorepo 的实现之一也并不尽善尽美,而不同场景对 Monorepo 依赖的原因、功能也有所不同,所以希望借这篇文章,从理论上解释清楚为什么会产生 Monorepo,以及...对于共用的包通过 Npm 安装,如果不能接受调试编译后的代码,或每次 npm link 一下,就没有办法调试依赖的子包。...一旦其中一个包进行了非正常改动,就会影响到整个项目,而我们精力有限,只盯着主仓库,往往会栽在不起眼的二方包发布上。...理想 monorepo 的设计 参考 Lerna 的规范,以 packages 作为子模块根文件夹,笔者设计一个理想的 monorepo 结构: . ├── packages │ ├─ module-a
领取专属 10元无门槛券
手把手带您无忧上云