Pylint with pre-commit and EsLlint with husky



我有一个前端使用JS,后端使用Python的项目。前端已经配置了哈士奇预提交挂钩。今天,我已经用预提交库配置了Pylint,但那个举动已经覆盖了husky钩子。有可能将预提交库和husky库结合起来吗?如果不是。。。解决这个问题的最佳方法是什么?

预提交有一个"迁移模式";用于运行其他现有的钩子框架。husky在钩子实现中似乎有点太聪明了,无法检测你正在运行的钩子——他们基于正在执行的文件名

预提交的迁移模式的工作方式是,它采用任何现有的钩子脚本(在本例中,是由husky编写到.git/hooks/pre-commit的钩子脚本(,并添加扩展.legacy。然后在执行过程中运行该脚本。

但对哈士奇来说,看起来pre-commit.legacy钩子正在运行

一个小技巧是在package.json中定义pre-commit.legacy,它似乎有效:

package.json

{
"husky": {
"hooks": {
"pre-commit.legacy": "echo hello world"
}
},
"dependencies": {
"husky": "^4.3.0"
}
}

.预调试-配置.yaml

# See https://pre-commit.com for more information
# See https://pre-commit.com/hooks.html for more hooks
repos:
-   repo: https://github.com/pre-commit/pre-commit-hooks
rev: v3.2.0
hooks:
-   id: trailing-whitespace
-   id: end-of-file-fixer
-   id: check-yaml
-   id: check-added-large-files
$ git commit -m "both"
husky > pre-commit.legacy (node v12.18.3)
hello world
Trim Trailing Whitespace.................................................Passed
Fix End of Files.........................................................Passed
Check Yaml...........................................(no files to check)Skipped
Check for added large files..............................................Passed
[master 7bd8807] both
1 file changed, 1 insertion(+), 1 deletion(-)

也就是说,这似乎很脆弱。pre-commit被设计为支持许多不同的编程语言(尽管它是用python编写的,但它本机支持10多种编程语言(包括javascript(


首先的替代方法可能是从local预提交挂钩调用husky:

package.json

{
"husky": {
"hooks": {
"pre-commit": "echo hello world"
}
},
"dependencies": {
"husky": "^4.3.0"
}
}

.pre-commit-config.yaml

# See https://pre-commit.com for more information
# See https://pre-commit.com/hooks.html for more hooks
repos:
-   repo: https://github.com/pre-commit/pre-commit-hooks
rev: v3.2.0
hooks:
-   id: trailing-whitespace
-   id: end-of-file-fixer
-   id: check-yaml
-   id: check-added-large-files
-   repo: local
hooks:
-   id: husky-run-pre-commit
name: husky
language: system
entry: node_modules/.bin/husky-run pre-commit
pass_filenames: false
always_run: true

执行

$ pre-commit run --all-files --verbose
Trim Trailing Whitespace.................................................Passed
- hook id: trailing-whitespace
- duration: 0.03s
Fix End of Files.........................................................Passed
- hook id: end-of-file-fixer
- duration: 0.03s
Check Yaml...............................................................Passed
- hook id: check-yaml
- duration: 0.05s
Check for added large files..............................................Passed
- hook id: check-added-large-files
- duration: 0.05s
husky....................................................................Passed
- hook id: husky-run-pre-commit
- duration: 0.07s
husky > pre-commit (node v12.18.3)
hello world

然而,这个解决方案并没有利用pre-commit的js支持,它只是调用了已经存在的husky钩子


一个更为原生的解决方案是通过预提交直接安装js挂钩,例如,如果您使用eslint:

repos:
-   repo: https://github.com/pre-commit/mirrors-eslint
rev: 'v7.9.0'  # Use the sha / tag you want to point at
hooks:
-   id: eslint
$ pre-commit  run --all-files
[INFO] Initializing environment for https://github.com/pre-commit/mirrors-eslint.
[INFO] Initializing environment for https://github.com/pre-commit/mirrors-eslint:eslint@7.9.0.
[INFO] Installing environment for https://github.com/pre-commit/mirrors-eslint.
[INFO] Once installed this environment will be reused.
[INFO] This may take a few minutes...
eslint...................................................................Passed

免责声明:我是预提交的作者

最新版本的预提交(2.14.0(和husky(7.0.2(对我来说效果更好的解决方案是将预提交集成到husky中,而不是相反。

./husky/_/pre-commit文件中,我添加了pre-commit run

见下文:

#!/bin/sh
. "$(dirname "$0")/_/husky.sh"
npx lint-staged
npx pretty-quick --staged
pre-commit run

最新更新