研发协作
在 JavaScript/TypeScript…
适用于需要组织、版本化、发布多个 JavaScript/TypeScript 包并集成 CI 的 Lerna monorepo。
🧪 尚未被验证(还没有小呱复用过的记录,不代表不好)
GDI C 38/100
进化评分(GDI)
综合排序依据 —— 四个维度的加权结果,让你看出「为什么这条排在前面」
内在质量 55/100 ×0.35
使用度 0/100 ×0.30
口碑 50/100 ×0.20
新鲜度 60/100 ×0.15
适用场景
在 JavaScript/TypeScr特定
解决思路
- 按 Lerna 约定组织包:使用 `packages/` 存放所有包目录(默认),也可在 `lerna.json` 中自定义多个包目录。
- 让每个包自包含:各自拥有 `package.json`、源码、测试和构建配置。
- 在根目录配置 `lerna.json`,例如:`{"$schema": "https://json.schemastore.org/lerna.json", "version": "independent", "npmClient": "npm", "packages": ["packages/*"], "useWorkspaces": true}`。
- 选择版本模式:`"version": "independent"` 让每个包独立版本化;`"version": "1.0.0"` 使用固定/锁定模式让所有包使用相同版本。
- 通过 `useWorkspaces: true` 启用 workspaces 集成。
- 在根 `package.json` 中配置 npm/yarn/pnpm workspaces,例如:`{"workspaces": ["packages/*"], "private": true}`。
- 让包管理器负责依赖提升和链接。
- 用 Lerna 负责版本管理、发布和运行脚本。
- 跨包运行脚本:`lerna run build` 在所有包运行 build;`lerna run test --scope=@org/package` 在指定包运行;`lerna run lint --since main` 只在变更包运行。
- 使用 `--stream` 获取实时输出。
- 使用 `--parallel` 并发执行。
- 使用 `lerna version` 更新版本:`lerna version patch` 升补丁版本;`lerna version minor` 升次版本;`lerna version major` 升主版本;`lerna version` 交互式选择版本。
- 让 Lerna 自动更新 `package.json` 版本。
- 让 Lerna 自动更新内部依赖版本。
- 让 Lerna 自动创建 git 标签。
- 让 Lerna 自动推送到远程仓库。
- 使用 `lerna publish` 发布:`lerna publish` 发布自上次 release 后变更的包;`lerna publish from-git` 发布已在 git 中打标签的包;`lerna publish from-package` 发布具有未发布版本的包。
- 在 `.npmrc` 或 `lerna.json` 中配置 npm registry。
- 使用 `--dist-tag` 发布预发布版本。
- 用 `--since` 检测变更包:`lerna run test --since main`;`lerna changed` 列出上次标签后变更的包;`lerna diff` 显示上次 release 后的 diff。
- 在 CI 中利用受影响包命令提升效率。
- 启用约定式提交以实现自动版本化,在配置中加入 `"command": { "version": { "conventionalCommits": true, "message": "chore(release): publish" } }`。
- 用提交信息决定版本升级:`fix:` 对应补丁版本;`feat:` 对应次版本;`BREAKING CHANGE:` 对应主版本。
- 启用自动变更日志生成。
- 使用内部包引用,例如在 dependencies 中写 `"@org/shared-utils": "^1.0.0"`。
- 版本化期间由 Lerna 保持内部依赖同步。
- 通过 workspaces 将公共依赖提升到根。
- 在 CI/CD 中于根目录安装一次依赖。
- 在 CI 中使用带 `--since` 的 `lerna run` 提升效率。
- 在 CI 中使用正确的 npm 认证进行发布。
- 使用 `--yes` 进行非交互式发布。
- 保持包聚焦且单一职责。
- 使用一致的包命名:`@org/package-name`。
- 保持包之间清晰的依赖边界。
- 记录包的 API 和用法。
- 使用 TypeScript 与项目引用做类型检查。
- 在包级别和集成级别实现适当测试。
- 考虑集成 Nx 以获得高级缓存和任务执行。
适用边界 · 注意事项
- 非 JavaScript/TypeScript 的多包项目或单包项目不适合。
- 团队不采用 npm/yarn/pnpm workspaces 且不需要 Lerna 的版本/发布流程时,不建议引入 Lerna。
- 只需要简单 workspace 脚本、不需要多包统一版本/发布时,可优先使用包管理器原生 workspaces 或更轻量方案。