我发现许多博客(包括lint-staged文档)介绍了一种使用husky + lint-staged的方式,如package.json中定义的以下代码:
{
"scripts": {
"precommit": "lint-staged"
},
"lint-staged": {
"src/**/*.js": ["prettier --write","eslint --fix", "git add"]
}
}
由于存在“漂亮”或“ eslint --fix”都无法修复的错误,我们如何防止这种用法带来的错误提交?
答案 0 :(得分:2)
您确实可以在lint阶段运行多个命令,如果其中一个失败,您将获得正确的退出代码,如下例所示。这可以通过新的沙哑钩子(https://github.com/typicode/husky#upgrading-from-014)系统实现:
在package.json
中具有这样的配置:
"husky": {
"hooks": {
"pre-commit": "lint-staged"
},
"lint-staged": {
"src/**/*.{js,jsx,ts,tsx,json,css}": [
"prettier --write",
"eslint --fix src/",
"tslint --fix --project .",
"git add"
]
},
配置运行prettier, eslint and tslint
-在掉毛问题上会出现以下错误:
husky > pre-commit (node v8.12.0)
↓ Stashing changes... [skipped]
→ No partially staged files found...
❯ Running linters...
❯ Running tasks for src/**/*.{js,jsx,ts,tsx,json,css}
✖ prettier --write
eslint --fix src/
tslint --fix --project .
git add
✖ prettier --write found some errors. Please fix them and try committing again.
...
husky > pre-commit hook failed (add --no-verify to bypass)
最后一行向您显示git自己的pre-commit
挂钩失败,因此您的更改将无法提交(如果它们不可修复)。
答案 1 :(得分:1)
我使用了一些文件,以防有人感兴趣:
// .prettierrc
{
"printWidth": 120,
"proseWrap": "preserve",
"semi": false,
"singleQuote": true,
"useTabs": false,
"tabWidth": 2,
"arrowParens": "avoid",
"trailingComma": "es5"
}
// .lintstagedrc
{
"**/*.+(js|md)": [
"prettier --write",
"eslint --fix src/",
"git add"
]
}
// .prettierignore
node_modules
coverage
// .huskyrc
{
"hooks": {
"pre-commit": "lint-staged"
}
}
答案 2 :(得分:0)
您不能,但是也不能通过定期掉毛来做到这一点。这不会给您解决方案,但会指出您的代码中可能存在的错误。
答案 3 :(得分:0)
我认为好的做法不仅仅是这些工具。
我会利用 .editorconfig
(并非每个人都使用相同的 IDE/Editor)与良好的 eslint
设置、测试和格式化脚本相结合。您将需要执行两次此操作,一次在通过 husky.. 的钩子设置中,一次在 CI 中。 (CI 会抓住那些试图通过钩子进行 --no-verify 的人)
运行 npm install --save-dev husky lint-staged
并在根目录下创建 .lintstagedrc
和 .huskyrc
。
package.json
中某些脚本的示例设置
package.json
在这个例子中,我有 lint、prettier 和一个格式脚本。请注意,我忽略了 .gitignore 中的文件进行格式化。
"format": "npm run pretty -- --write",
"lint": "eslint --ignore-path .gitignore --ext .js --ext .jsx .",
"pretty": "prettier --ignore-path .gitignore \"**/*.+(js|json|md)\"",
.lintstagedrc
当从 husky hook 调用 lint-staged 时,这将运行我想要运行的命令。如果您想将 --fix 添加到 eslint 命令,您可以在此处附加它。请确保您的更漂亮的工具已设置为随后处理格式。
{
"*.+(js|jsx)":[
"eslint"
],
"*.+(js|json|md)":[
"prettier --write"
]
}
.huskyrc
显然,您可以通过 husky.. 甚至强制执行提交消息,在 pre-commit、pre-push 或其他钩子中扩展大量脚本。
{
"hooks":{
"pre-commit": "lint-staged && npm run test",
"commit-msg": "commitlint -E HUSKY_GIT_PARAMS"
}
}