Monorepo:是管理项目代码的一个方式,指在一个项目仓库 (repo) 中管理多个模块/包 (package),不同于常见的每个模块建一个 repo。
Lerna:是一个管理多个 npm 模块的工具,是 Babel 自己用来维护自己的 Monorepo 并开源出的一个项目。优化维护多包的工作流,解决多个包互相依赖,且发布需要手动维护多个包的问题。
lerna
和yarn
$ npm i -g lerna yarn 复制代码
$ mkdir ndogkit && cd ndogkit $ lerna init $ tree -a -C --dirsfirst -L 3 -I 'node_modules|.git' . ├── packages ├── lerna.json └── package.json 复制代码
{ ... "name": "root", /* 项目根目录下的private必须设置成true,否则workspace不会被启用 */ "private": true, /* 指定需要管理的模块,这里的包组织方式参考的vuepress */ "workspaces": [ /* 所有模块包在此文件夹下 */ "packages/@ndogkit/*", /* 文档说明 */ "packages/doc", /* 脚手架相关 */ "packages/ndogkit" ] ... } 复制代码
{ ... /* [doc](https://github.com/lerna/lerna/tree/master/commands) */ "command": { "bootstrap": { /* 此模式:当多个包有相同依赖时会提升到顶层的node_modules,避免重复安装,减少体积 */ "hoist": true, /* 在bootstrap期间,将参数传递给 npm install */ "npmClientArgs": ["--no-package-lock", "--no-ci"] }, "version": { "allowBranch": ["master"], /* 开启的话,提交当前所有更改,而不是添加新的提交,会跳过 `git commit`、`git push` */ "amend": false, /* 自动生成changelog.md,详情请看[约定式提交](https://www.conventionalcommits.org/zh-hans/v1.0.0-beta.4/) */ "conventionalCommits": true }, "publish": { /* 跳过npm包访问权限 */ "verifyAccess": false, /* 发布地址 */ "registry": "http://npm.jsany.org" } }, /* 使用yarn运行所有命令 */ "npmClient": "yarn", /* 使用yarn的工作区(需在package.json中指定workspaces) */ "useWorkspaces": true, /* 独立模式:该模式下只有改动过的 package 才会被发布,每次发布时,都会提示您已更改的每个软件包,以指定是补丁,次要,主要还是自定义更改,注意:使用约定式提交后,会根据commit生成对应版本,无需手动指定 */ "version": "independent" ... } 复制代码
$ tree -a -C --dirsfirst -L 3 -I 'node_modules|.git|package-lock.json' ./packages ├── @ndogkit │ ├── core │ ├── egg-tools │ └── shared-utils ├── docs └── ndogkit ├── cmds ├── utils ├── cli.js ├── index.js └── package.json # 查看所有package,注意 package.json 中若设置了"private": true,则不会展示 $ lerna ls info cli using local version of lerna lerna notice cli v3.19.0 lerna info versioning independent @ndogkit/core @ndogkit/egg-tools @ndogkit/shared-utils ndogkit lerna success found 4 packages 复制代码
注意:这里 lerna 取得模块名是来自 package.json
的 name
属性
# --npm-client=yarn --hoist 会冲突 # 用 yarn workspace 特性替代 lerna bootstrap $ yarn 复制代码
# yarn 使用 workspace 模式安装 npm 包时必须加 -W 参数 $ yarn add -D -W [...pkg] 复制代码
$ yarn workspace @ndogkit/share-utils add chalk debug globby fs-extra mime 复制代码
# 一定要指定正确的版本号,不然会到npm查找包 $ yarn workspace @ndogkit/egg-tools add @ndogkit/shared-utils@1.0.0 复制代码
$ lerna clean && rm -rf ./node_modules 复制代码
# lerna run [...cmd] --scope @scope $ lerna run compile --scope @ndogkit/shared-utils 复制代码
# 查看更改,同样 package.json 中设置了 "private": true 的 package 不会展示 $ lerna changed # 每次发布会自动更新相关package的版本号,并且会更新引用该package的其他package依赖 $ lerna publish 复制代码