如何在每次推送 Node.js monorepo 之前格式化/测试?
How to format / test before every push in a Node.js monorepo?
我知道几个工具,如 husky、lint-staged 和 prettier,目前我有一个使用 yarn workspaces 和 lerna 的 monorepo,在每次推送之前使用 git 我想要 prettier 格式化我的代码和运行 一个测试脚本,如果每个项目都发生这种情况并不重要,但最好只 运行 项目中发生变化的那些脚本当然,我的问题是什么工具可以真正帮助我有了这个,我该如何设置它们?我是为每个项目单独设置它们,还是可以在我的根 package.json 中设置一些东西?目前看起来像
{
"name": "orgname",
"private": true,
"workspaces": [
"packages/*"
],
"scripts": {
"build": "lerna run build",
"dev": "lerna run start --stream --parallel",
"test": "lerna run test --"
},
"husky": {
"hooks": {
"pre-commit": "npm test"
}
},
"prettier": {
"semi": true,
"singleQuote": true,
"trailingComma": "es5"
},
"devDependencies": {
"lerna": "^3.22.1"
}
}
您可以在每个 lerna 包的 package.json 中添加 lint: ...
脚本,例如;
./packages/web/package.json
...
"scripts": {
"lint": "vue-cli-service lint --fix"
},
./packages/api/package.json
...
"scripts": {
"lint": "eslint --fix src",
}
并且在主要 package.json 中,您可以添加一个 lint 脚本,运行 包的每个 lint 命令。
最后将其添加到 husky 预提交挂钩中,因此每次提交前它都会 运行。
./package.json
"scripts": {
"lint": "lerna run lint"
},
"husky": {
"hooks": {
"pre-commit": "yarn lint && yarn test"
}
}
在所选答案中添加了关于使用 lint-staged
包的评论,基本上它使您能够将 linting 和其他例程专门应用于更改的文件,而不是所有包。它可能有用,具体取决于您如何使用 monorepo 方法。
/packages/example-name/.lintstagedrc.json
{
"*.{js,ts}": ["eslint --fix", "git add"]
}
/packages/example-name/package.json
{
[...]
"scripts": {
"precommit": "lint-staged"
}
[...]
}
/package.json
{
[...]
"husky": {
"hooks": {
"pre-commit": "lerna run precommit --since HEAD"
}
},
[...]
}
我知道几个工具,如 husky、lint-staged 和 prettier,目前我有一个使用 yarn workspaces 和 lerna 的 monorepo,在每次推送之前使用 git 我想要 prettier 格式化我的代码和运行 一个测试脚本,如果每个项目都发生这种情况并不重要,但最好只 运行 项目中发生变化的那些脚本当然,我的问题是什么工具可以真正帮助我有了这个,我该如何设置它们?我是为每个项目单独设置它们,还是可以在我的根 package.json 中设置一些东西?目前看起来像
{
"name": "orgname",
"private": true,
"workspaces": [
"packages/*"
],
"scripts": {
"build": "lerna run build",
"dev": "lerna run start --stream --parallel",
"test": "lerna run test --"
},
"husky": {
"hooks": {
"pre-commit": "npm test"
}
},
"prettier": {
"semi": true,
"singleQuote": true,
"trailingComma": "es5"
},
"devDependencies": {
"lerna": "^3.22.1"
}
}
您可以在每个 lerna 包的 package.json 中添加 lint: ...
脚本,例如;
./packages/web/package.json
...
"scripts": {
"lint": "vue-cli-service lint --fix"
},
./packages/api/package.json
...
"scripts": {
"lint": "eslint --fix src",
}
并且在主要 package.json 中,您可以添加一个 lint 脚本,运行 包的每个 lint 命令。
最后将其添加到 husky 预提交挂钩中,因此每次提交前它都会 运行。
./package.json
"scripts": {
"lint": "lerna run lint"
},
"husky": {
"hooks": {
"pre-commit": "yarn lint && yarn test"
}
}
在所选答案中添加了关于使用 lint-staged
包的评论,基本上它使您能够将 linting 和其他例程专门应用于更改的文件,而不是所有包。它可能有用,具体取决于您如何使用 monorepo 方法。
/packages/example-name/.lintstagedrc.json
{
"*.{js,ts}": ["eslint --fix", "git add"]
}
/packages/example-name/package.json
{
[...]
"scripts": {
"precommit": "lint-staged"
}
[...]
}
/package.json
{
[...]
"husky": {
"hooks": {
"pre-commit": "lerna run precommit --since HEAD"
}
},
[...]
}