如何在自定义git pre-commit钩子脚本中正常运行jest?
问题根因
- package.json语法错误
你提供的package.json中devDependencies闭合大括号后多了一个多余的逗号,JSON语法不允许对象末尾存在尾逗号,这是jest解析package.json报错的直接原因,删除该逗号即可解决解析报错。 - shell脚本语法错误
判断条件中[$jest_exit_code -ne 0]的方括号和变量之间缺少空格,shell会把[1整体识别为命令,才会报[1: command not found错误,补充空格即可修复。
对应解决方案
1. pre-commit脚本正确指定jest配置的方法
你原来指定--config ./jest.config.js的写法本身是正确的,修复上述两个错误后即可正常运行。更稳妥的写法是直接调用package.json中已经封装好的test脚本,避免手动处理路径问题:
# 替换原来的jest调用行 npm run test -- --config ./jest.config.js # 如果只需要检测本次提交修改的文件,提速效果更明显,可以直接用你封装的test:staged命令 npm run test:staged -- $all_ts_files
修正后的完整pre-commit脚本参考:
#!/bin/sh linter_exit_code=0 jest_exit_code=0 git config advice.addEmptyPathspec false echo "Getting staged files..." all_ts_files=$(git diff --cached --diff-filter=d --name-only | grep .ts$) # 无ts修改文件直接跳过校验 if [ -z "$all_ts_files" ]; then echo "✔ No TypeScript files changed, skip check" exit 0 fi echo "Running Eslint..." ./node_modules/.bin/eslint $all_ts_files --quiet --fix linter_exit_code=$? echo "Running Jest test..." npm run test:staged -- $all_ts_files jest_exit_code=$? git add -f $all_ts_files if [ $linter_exit_code -ne 0 ] || [ $jest_exit_code -ne 0 ] then echo "❌ Errors occured in Linter or Jest ( ͡ಥ ͜ʖ ͡ಥ)" exit 1 else echo "✔ All passed [̲̅$̲̅(̲̅ ͡° ͜ʖ ͡°̲̅)̲̅$̲̅]" exit 0 fi
2. jest配置迁入package.json的方法(非必要,不推荐)
独立的jest.config.js是jest官方推荐的配置方式,优先级高于package.json中的配置,不会对应用启动产生任何影响,你之前迁移后启动报错大概率是修改package.json时产生了语法问题。
如果必须迁入,只需要将jest.config.js导出的对象转换为严格JSON格式,添加到package.json的jest根字段即可:
- 去掉所有尾逗号
- 所有字符串用双引号包裹
- 移除module.exports语法
示例配置:
{ // 原有package.json内容保留 "jest": { "preset": "jest-preset-angular", "setupFilesAfterEnv": ["<rootDir>/setup-jest.ts"], "testPathIgnorePatterns": [ "<rootDir>/node_modules/", "<rootDir>/dist/", "<rootDir>/src/test.ts" ], "globals": { "ts-jest": { "tsConfig": "<rootDir>/tsconfig.spec.json", "stringifyContentPathRegex": "\\.html$", "astTransformers": { "before": [ "jest-preset-angular/build/InlineFilesTransformer", "jest-preset-angular/build/StripStylesTransformer" ] } } } } }
迁入后无需在jest启动参数中指定配置文件,jest会自动读取package.json中的jest字段。
3. 其他优化建议
- 优先使用npm scripts调用封装好的命令,避免手动处理node_modules路径、参数继承等问题
- 增加空文件判断逻辑,避免没有ts修改文件时报错
- pre-commit阶段建议只跑修改文件对应的测试用例,全量测试放到pre-push阶段执行,提升提交效率
内容的提问来源于stack exchange,提问作者Arp
相关产品推荐
相关产品推荐

