Monorepo 是针对单仓库、多 package 的流行解决方案, lerna 是它的一种实现。
说明
重要package版本说明:
- "husky": "^6.0.0"
- "lint-staged": "^10.5.4"
- "@commitlint/cli": "^12.0.1"
- "@commitlint/config-conventional": "^12.0.1"
- "cz-customizable": "^6.3.0"
配置husky
在lerna项目根目录中安装husky
:
yarn add husky -D
- 在
package.json
的scripts
中添加"prepare": "husky install"
,并运行这条命令:
npm set-script prepare "husky install" && npm run prepare
- 添加一个hook:
npx husky add .husky/pre-commit "npm test"
上面这个命令会在.husky
目录下新建一个pre-commit
文件,其内容如下:
#!/bin/sh
. "$(dirname "$0")/_/husky.sh"
npm test
以上都是手动安装husky
的过程,当然官方也提供了一键安装和配置脚本,推荐使用:
npx husky-init && npm install # npm
npx husky-init && yarn # Yarn 1
yarn dlx husky-init --yarn2 && yarn # Yarn 2
如果使用的是v4版本的husky
,想升级到v6,可以使用以下命名,一键迁移:
// npm
npm install husky@6 --save-dev \
&& npx husky-init \
&& npm exec -- github:typicode/husky-4-to-6 --remove-v4-config
// yarn 1
yarn add husky@6 --dev \
&& npx husky-init \
&& npm exec -- github:typicode/husky-4-to-6 --remove-v4-config
// yarn 2
yarn add husky@6 --dev \
&& yarn dlx husky-init --yarn2 \
&& npm exec -- github:typicode/husky-4-to-6 --remove-v4-config
配置lint-staged
在lerna
项目中,由于所有子项目公用一个 repo 源代码仓库,因此它的 husky 钩子只能建立在最顶层目录;
而每次 commit 都很有可能是多个子项目都有改动,这个时候使用 lint-staged
时,就不但要区分文件类型,还要区分改动文件所在的子项目(因为不同的子项目可能会有不同的校验处理)。
这时,我们可以使用 lerna 命令来实现对“哪个子项目有修改”的判断;而 lint-staged
就需要安装在任何一个需要做校验的子项目中。
- 添加或修改
.husky
目录下的pre-commit
钩子如下:
#!/bin/sh
. "$(dirname "$0")/_/husky.sh"
lerna run --concurrency 1 --stream precommit --since HEAD --exclude-dependents
其中,precommit
是在pre-commit
钩子中触发的子项目的命令
- 在子项目中安装和配置
lint-staged
,并添加precommit
命令
- 安装
lint-staged
:
lerna add lint-staged --scope=xxxx -D
- 在添加
precommit
命令:
"precommit": "lint-staged"
- 配置
lint-staged
:
"lint-staged": {
"*.{ts,tsx,js,jsx}": [
"eslint"
]
},
配置commitlint和cz-customizable
每个团队对提交的commit message格式有约定俗称的要求,但是没有一个统一的规范,导致大家提交的commit message或多或少不太一样。因此,需要一个工具来帮助大家统一commit message的格式,也方便后续的分析和拓展。
cz-customizable
是一个帮助书写commit message的工具,而commitlint
是一个校验commit message的工具。
- 安装
commitlint
和cz-customizable
:
yarn add @commitlint/cli @commitlint/config-conventional cz-customizable -D
- 在
package.json
中添加以下配置:
{
...
"config": {
"commitizen": {
"path": "./node_modules/cz-customizable"
},
"cz-customizable": {
"config": "./.cz-config.js"
}
},
...
}
- 在项目根目录中新建
.cz-config.js
文件,内容如下:
module.exports = {
types: [
{ value: 'feat', name: 'feat: A new feature' },
{ value: 'fix', name: 'fix: A bug fix' },
{
value: 'style',
name:
'style: Changes that do not affect the meaning of the code\n (white-space, formatting, missing semi-colons, etc)',
},
{
value: 'refactor',
name:
'refactor: A code change that neither fixes a bug nor adds a feature',
},
{ value: 'revert', name: 'revert: Revert to a commit' },
{
value: 'chore',
name:
'chore: Changes to the build process or auxiliary tools\n and libraries such as documentation generation',
},
{ value: 'docs', name: 'docs: Documentation only changes' },
{
value: 'perf',
name: 'perf: A code change that improves performance',
},
{ value: 'test', name: 'test: Adding missing tests' },
],
scopes: [
{ name: 'frontend' },
{ name: 'backend' },
{ name: 'service' },
],
messages: {
type: "Select the type of change that you're committing:",
scope: "\n Select the scope of change that you're committing:",
// used if allowCustomScopes is true
customScope: 'Denote the custom scope:',
subject: 'Write a SHORT, IMPERATIVE tense description of the change:\n',
body:
'Provide a LONGER description of the change (optional). Use "|" to break new line:\n',
breaking: 'List any BREAKING CHANGES (optional):\n',
footer:
'List any ISSUES CLOSED by this change (optional). E.g.: #31, #34:\n',
confirmCommit: 'Are you sure you want to proceed with the commit above?',
},
allowCustomScopes: true,
}
- 在项目根目录中新建
.commitlintrc.js
文件,内容如下:
const typeEnum = require('./.cz-config');
module.exports = {
extends: ['@commitlint/config-conventional'],
rules: {
'type-enum': [2, 'always', typeEnum.types.map((i) => i.value)],
'scope-enum': [2, 'always', typeEnum.scopes.map((i) => i.name)],
'scope-empty': [2, 'never'],
},
};
配置完成后,每次提交commit时,可以使用git cz
替换git commit
命令,从而辅助我们更加规范的书写commit message。
总结
以上就是我对如何在lerna项目中配置husky、lint-staged和Cz工具的一些粗略认知,当然不仅仅是lerna项目,也适用于任何前端项目。
链接
-
husky官文文档
-
lint-staged官方文档
-
Cz工具集使用介绍
常见问题FAQ
- 免费下载或者VIP会员专享资源能否直接商用?
- 本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
- 提示下载完但解压或打开不了?
- 找不到素材资源介绍文章里的示例图片?
- 模板不会安装或需要功能定制以及二次开发?
发表评论
还没有评论,快来抢沙发吧!