将其添加到 package.json 后,husky 预提交钩子不起作用

Posted

技术标签:

【中文标题】将其添加到 package.json 后,husky 预提交钩子不起作用【英文标题】:husky pre-commit hook not working after adding it to package.json 【发布时间】:2021-07-07 10:53:20 【问题描述】:

我正在开发一个项目,我希望每次尝试提交新更改时,都会运行我的测试,并据此决定提交是否会发生。为此,我进行了研究,发现我可以使用husky's pre-commit hook。

我首先在我的项目中安装了 husky npm i husky --save-dev 在我的package.json 中安装了"husky": "^6.0.0"

然后我按照教程在package.json中添加了以下对象

 "husky": 
    "hooks": 
      "applypatch-msg": "echo \"[Husky] applypatch-msg\"",
      "pre-applypatch": "echo \"[Husky] pre-applypatch\"",
      "post-applypatch": "echo \"[Husky] post-applypatch\"",
      "pre-commit": "echo \"[Husky] pre-commit\""
    
  

如您所见,运行 git commit -m "some message!" 应该回显一堆东西,这意味着 husky 的预提交挂钩正在工作,但没有任何类似的东西得到回显。现在我只是不知道为什么这不起作用。如果它成功了,我会继续在 pre-commit 挂钩中添加脚本来运行我的测试。

顺便说一下,这里是package.json文件:


  "name": "test app",
  "version": "1.0.1",
  "description": "test app",
  "main": "index.js",
  "scripts": 
    "start": "node index.js",
    "dev": nodemon index.js",
    "test": "find ./plugins -name '*test.js' | xargs mocha -R spec"
  ,
  "dependencies": 
    "@hapi/boom": "^9.0.0",
    "@hapi/glue": "^7.0.0",
    "@hapi/good": "^9.0.0",
    "@hapi/good-console": "^9.0.0",
    "@hapi/good-squeeze": "^6.0.0",
    "@hapi/hapi": "^19.1.1",
    "@hapi/joi": "^17.1.1",
    "axios": "^0.19.2",
    "babel-eslint": "^10.1.0",
    "base-64": "0.1.0",
    "confit": "2.3.0",
    "hapi-auth-jwt2": "^8.8.1",
    "hapi-mongodb": "^9.0.0",
    "jws": "4.0.0",
    "mongodb": "^3.5.7",
    "pad-left": "2.1.0",
    "pino": "^5.16.0",
    "query-string": "^6.13.1",
    "redis": "^2.8.0",
    "selectn": "^1.1.2",
    "superagent": "3.8.2",
    "utf8": "^3.0.0",
    "uuid": "^3.4.0",
  ,
  "devDependencies": 
    "chai": "^4.1.2",
    "chai-datetime": "^1.6.0",
    "chai-http": "^4.0.0",
    "husky": "^6.0.0",
    "mocha": "^5.1.1",
    "nodemon": "^2.0.4",
    "proxyquire": "^2.0.1",
    "sinon": "^5.0.10",
    "sinon-test": "^2.2.0"
  ,
  "husky": 
    "hooks": 
      "applypatch-msg": "echo \"[Husky] applypatch-msg\"",
      "pre-applypatch": "echo \"[Husky] pre-applypatch\"",
      "post-applypatch": "echo \"[Husky] post-applypatch\"",
      "pre-commit": "echo \"[Husky] pre-commit\""
    
  

【问题讨论】:

好吧,我仍然无法让它工作,但我确实发现使用 husky v6,我们不再在 package.json 文件中添加这样的钩子了。然而,将 husky 降级到第 4 版也没有奏效。为什么? 我对赫斯基本身知之甚少,但是:这些不同的步骤中的哪一个在您的存储库中的.git/hooks/ 中安装了文件?检查至少有一个可执行的 Git 钩子,例如,.git/hooks/pre-commit 存在并且是可执行的。 【参考方案1】:

这有点旧,但也许我的解决方案会对某人有所帮助。

我也无法使用这种技术。我发现的最干净的是

将脚本添加到 json 包中:

"prepare": ""chmod ug+x ./installHooks.sh && ./installHooks.sh""

installHooks.sh 包含:

#!/bin/zsh
FILE=.husky
if test -d "$FILE"; then
  echo "$FILE folder already exists, deleting it before new husky installation";
  rm -rf "./$FILE"
  # else echo "$FILE doesn't exist yet";
fi
  cd ../ && husky install ./sub-project/.husky
  cd sub-project && npx husky add .husky/pre-commit 'cd sub-project && npm test'
  chmod ug+x ./.husky/*
  echo "hooks correctly installed. you may find them in `.husky/pre-commit`"
  echo "they will be triggered each time you commit"

说明: 运行npm install时会自动运行准备脚本,也可以使用npm run prepare运行 它将 installHooks.sh 的模式更改为可执行然后运行它。 installHooks 将检查 .husky 文件夹是否已经存在,如果是则将其删除,然后安装 husky (注意,在子项目中上一个文件夹然后下一个文件夹是因为我的 git repo 包含多个子项目,我想将其安装在前端的,这里称为子项目。husky 要求您从根目录安装它,因此这是一种解决方法)。然后添加 pre-commit hook (npm test) 最后使用 chmod 使 husky hooks 可执行

如果您有任何问题,请告诉我。我刚刚开始编写脚本,所以这可能不是最好的方法,但它可以工作

【讨论】:

以上是关于将其添加到 package.json 后,husky 预提交钩子不起作用的主要内容,如果未能解决你的问题,请参考以下文章

升级到 vue 3 后:“找不到模块 '@vue/compiler-sfc/package.json'”

为啥我可以将脚本添加到 package.json 中的脚本? [关闭]

当我提交新文件时,husk 不执行预提交[关闭]

json 将json-server脚本添加到package.json

sh 将模块添加到package.json

如何将 package.json 导入 Typescript 文件而不将其包含在编译输出中?