如何从yarn zero install依赖中构建可独立部署的单包产物?
Yarn Workspaces + Zero Install 单包独立部署方案
以下两种方案均无侵入性,不需要修改现有项目配置:
方案1:使用Yarn原生focus命令(推荐)
Yarn 2+ 内置了workspace focus能力,专门用于单个子包的依赖安装:
- 先在CI环境拉取完整monorepo代码(需包含根目录
.yarn缓存目录、.yarnrc.yml、yarn.lock等配置文件) - 执行单包依赖安装命令,假设目标包的package.json中name为
@your-project/server,路径为packages/server:
该命令只会为目标包安装生产环境依赖,自动生成对应子包目录下的yarn workspaces focus @your-project/server --productionnode_modules,不会处理其他workspace的内容 - 正常执行目标包的构建命令,比如
yarn workspace @your-project/server build - 最后将
packages/server目录下的构建产物、package.json、node_modules打包后即可直接部署
方案2:完全抽离独立打包(适合需要脱离monorepo结构部署的场景)
如果需要生成完全不依赖原monorepo的部署包,可以按以下步骤操作:
- 从根目录package.json、yarn.lock中提取目标包的所有依赖(包含monorepo内的本地依赖)
- 新建临时目录,将目标包的所有源码、package.json复制到临时目录
- 如果依赖了monorepo内的其他本地包,将这些本地包的源码也按原workspace路径复制到临时目录
- 在临时目录新增极简
.yarnrc.yml配置,指定nodeLinker: node-modules,再复制根目录的yarn.lock到临时目录 - 在临时目录执行
yarn install --production生成独立的node_modules - 剔除临时目录内的配置文件、冗余源码后打包部署
常见优化点
- 如果部署包体积过大,可以执行
yarn autoclean --force清理node_modules中的冗余文件 - 依赖monorepo本地包的场景,focus命令会自动将本地包的构建产物打包进依赖,无需手动处理
内容的提问来源于stack exchange,提问作者Lucas Heim
相关产品推荐
相关产品推荐

