这里主要介绍lerna
、yarn workspaces
的使用方法与职能界限。
-
lerna
:项目管理与发版 -
workspaces
:依赖管理
以上能力结合交互式命令行,打造自动化项目开发流程。
出发点
- 规范化项目管理
- 自动提交 + 版本号
- 交互式commit msg
- 自动生成日志
- 一目了然的项目依赖
- 交互式的项目调试流程
准备工作
npm i -g lerna
-
lerna -v
// 确认安装成功。 -
yarn -v
// 确认安装yarn
。应该随node
默认安装的
创建Monorepo环境
定义工作区,可独立管理应用依赖
vue create monorepo
cd monorepo
lerna init
- 修改
package.json
// 追加——定义工作区,可独立管理应用依赖 workspaces: [ "packages/*" ]
yarn workspaces info
配置版本服务器
- 配置commit msg校验
yarn add -W -D commitizen
// root目录下安装依赖-W
-
npx commitizen init cz-lerna-changelog --yarn --dev --exact
// 以上两步创建
Commitizen-friendly
交互式commit msg
—— 让您不必再深挖文档查找commit格式. Node10+支持//
commitizen init
自动安装依赖cz-lerna-changelog
//
commitizen init
自动添加config.commitizen
到package.json
// 不同的适配器(E.g.
cz-lerna-changelog
)提供不同的交互界面// 缺点:不符合常规命令习惯
npm run cm
-
手动添加scripts
"cm": "cz"
// 不使用commit
做scripts的key
是避免冲突if you are using precommit hooks thanks to something like husky, you will need to name your script some thing other than "commit" (e.g. "cm": "cz"). The reason is because npm-scripts has a "feature" where it automatically runs scripts with the name prexxx where xxx is the name of another script. In essence, npm and husky will run "precommit" scripts twice if you name the script "commit", and the work around is to prevent the npm-triggered precommit script.
-
适配
git commit
命令yarn add -W -D husky
- 手动追加
husky.hooks
到package.json
... "husky": { "hooks": { "commit-msg": "exec < /dev/tty && git cz --hook || true", "commit": "echo '-----pre-commit====", "push": "echo '-----pre-push====" } }, ... ``` > Why exec < /dev/tty? By default, git hooks are not interactive. This command allows the user to use their terminal to interact with Commitizen during the hook.
- 初始化Git服务器
git remote add origin ...
git add .
-
git commit -m "..."
// 该命令后,进入commit msg交互:husky
配置提供; -
git push ...
// 初始化远程库,使用git push
进行第一次提交lerna.json
的默认0.0.0版本,不使用lerna version
做第一次提交
自动生成变更日志
```
// 修改lerna.json
...
"command": {
"version": {
"conventionalCommits": true
}
},
"ignoreChanges": [
""
]
...
```
lerna version 会检测从上一个版本发布以来的变动,但有一些文件的提交,我们不希望触发版本的变动,譬如 .md 文件的修改,并没有实际引起 package 逻辑的变化,不应该触发版本的变更,可以通过 ignoreChanges 配置排除
创建测试项目
-
创建一个子项目
packages/v1act/
- 创建目录
packages/v1act/
- 创建文件
packages/v1act/package.json
{ "name": "v1act", "version": "0.0.0", // 与lerna.json'version'保持一致 "private": true // 注意:追加该属性lerna ls -l会忽略该子项目, yarn workspaces info 可以查看该工作区 }
-
lerna ls -l
或lerna ls --json
// 查看仓库项目组织结构
- 创建目录
-
更新代码
git add
git commit -m ''
-
lerna version
// 交互式版本更新 + 自动提交,没有packages/内容变更的话,不能通过lerna version提交,只能通过git push