You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在自定义git pre-commit钩子脚本中正常运行jest?

问题根因

  1. package.json语法错误
    你提供的package.json中devDependencies闭合大括号后多了一个多余的逗号,JSON语法不允许对象末尾存在尾逗号,这是jest解析package.json报错的直接原因,删除该逗号即可解决解析报错。
  2. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.11 11:12:03