带有预提交的 Pylint 和带有 husky 的 EsLlint
Pylint with pre-commit and EsLlint with husky
我有一个项目,前端使用 JS,后端使用 Python。
前端已经配置了 husky 预提交钩子。
今天我用预提交库配置了 Pylint,但是 husky hooks 已经被那个移动覆盖了。
是否可以结合预提交库和哈士奇库?
如果不是...解决问题的最佳方法是什么?
pre-commit 有一个针对 运行 其他现有钩子框架的“迁移模式”。似乎 husky 在他们的钩子实现中有点太聪明了,无法检测你是什么钩子 运行——他们基于正在执行的文件名
pre-commit的迁移模式的工作方式是它采用任何现有的钩子脚本(在本例中,是 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"
}
}
.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
$ 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+ programming languages( 包括 javascript))
第一个替换可能是从 local
pre-commit 钩子调用 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 支持,它只是调用 already-existing husky hooks
一个更原生的解决方案是直接使用 pre-commit 安装 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
免责声明:我是 pre-commit
的作者
一个更适合我的解决方案,最新版本的 pre-commit (2.14.0) 和 husky (7.0.2) 是将 pre-commit 集成到 husky 中,而不是相反。
在./husky/_/pre-commit
文件中,我添加了pre-commit run
。
见下文:
#!/bin/sh
. "$(dirname "[=10=]")/_/husky.sh"
npx lint-staged
npx pretty-quick --staged
pre-commit run
我有一个项目,前端使用 JS,后端使用 Python。 前端已经配置了 husky 预提交钩子。 今天我用预提交库配置了 Pylint,但是 husky hooks 已经被那个移动覆盖了。 是否可以结合预提交库和哈士奇库? 如果不是...解决问题的最佳方法是什么?
pre-commit 有一个针对 运行 其他现有钩子框架的“迁移模式”。似乎 husky 在他们的钩子实现中有点太聪明了,无法检测你是什么钩子 运行——他们基于正在执行的文件名
pre-commit的迁移模式的工作方式是它采用任何现有的钩子脚本(在本例中,是 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"
}
}
.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
$ 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+ programming languages( 包括 javascript))
第一个替换可能是从 local
pre-commit 钩子调用 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 支持,它只是调用 already-existing husky hooks
一个更原生的解决方案是直接使用 pre-commit 安装 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
免责声明:我是 pre-commit
的作者一个更适合我的解决方案,最新版本的 pre-commit (2.14.0) 和 husky (7.0.2) 是将 pre-commit 集成到 husky 中,而不是相反。
在./husky/_/pre-commit
文件中,我添加了pre-commit run
。
见下文:
#!/bin/sh
. "$(dirname "[=10=]")/_/husky.sh"
npx lint-staged
npx pretty-quick --staged
pre-commit run