将Cypress命令添加到husky pre-push时出现模块未找到错误
问题原因及解决办法
原因
Husky的pre-push钩子运行在非交互式shell环境中,不会自动加载用户的shell配置文件(比如~/.zshrc、~/.bash_profile),导致终端中存在的环境变量(如PATH、Cypress相关路径变量)没有被带入钩子环境。这会让Cypress无法正确解析缓存中的安装路径,出现错误里的路径重复(Cypress.app/Contents/MacOS/Contents/Resources),最终找不到指定模块。
解决方法
1. 在钩子中加载shell配置文件
修改.husky/pre-push,先加载你的shell配置,确保环境和终端一致:
- 如果你用Zsh:
#!/bin/sh . "$(dirname "$0")/_/husky.sh" source ~/.zshrc npm run test npm run test:e2e
- 如果你用Bash:
#!/bin/sh . "$(dirname "$0")/_/husky.sh" source ~/.bash_profile npm run test npm run test:e2e
2. 强制Cypress重新安装
在运行测试前先执行Cypress安装命令,确保路径正确:
修改.husky/pre-push:
#!/bin/sh . "$(dirname "$0")/_/husky.sh" npm run test npx cypress install npm run test:e2e
或者直接在package.json的test:e2e脚本中集成安装步骤:
{ "scripts": { "test:e2e": "cypress install && cypress run" } }
3. 手动指定Cypress缓存路径
通过环境变量CYPRESS_CACHE_FOLDER固定缓存位置,避免路径解析错误:
#!/bin/sh . "$(dirname "$0")/_/husky.sh" export CYPRESS_CACHE_FOLDER="/Users/me/Library/Caches/Cypress" npm run test npm run test:e2e
4. 排查环境变量差异
如果以上方法无效,可以先打印钩子环境的信息,对比终端输出找差异:
#!/bin/sh . "$(dirname "$0")/_/husky.sh" # 打印当前用户和PATH变量 whoami echo $PATH npm run test npm run test:e2e
将钩子输出的PATH和终端中执行echo $PATH的结果对比,把缺失的路径补充到钩子的环境变量中。
内容的提问来源于stack exchange,提问作者Terrabythia
相关产品推荐
相关产品推荐

