You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Heroku部署Node.js应用疑似缓存问题导致构建失败求助

解决Heroku Node.js构建失败:husky找不到cross-spawn的问题

看起来你遇到的问题是几个因素叠加导致的——既有git提交不完整的问题,也有旧npm版本处理依赖的bug,还有Heroku缓存的潜在影响。我来一步步帮你拆解和解决:

1. 优先解决package.json版本不一致的问题

你提到本地package.json版本是0.0.7,但Heroku构建时显示0.0.3,这说明你本地的修改(包括package.json的版本、脚本修改等)根本没推送到Heroku的git仓库。Heroku只会使用你推送的仓库里的代码,所以所有修改必须先提交到本地git,再推送:

  • 先检查未提交的文件:
    git status
    
  • 把package.json、package-lock.json(如果存在)都添加并提交:
    git add package.json package-lock.json
    git commit -m "Sync package version and fix build scripts"
    

2. 处理旧npm版本的依赖管理bug

你使用的npm 5.6.0是Node 8.11.1自带的旧版本,它在处理嵌套依赖(比如husky依赖execa,execa又依赖cross-spawn)时存在已知的bug,无法正确安装深层依赖。解决方法是升级npm到Node 8兼容的最新版本:

  • 修改package.json里的engines字段,指定兼容的npm版本(Node 8最高支持npm 6.x系列,推荐用最后一个稳定版):
    "engines": {
      "node": "8.11.1",
      "npm": "6.14.15"
    }
    
  • 本地先升级npm并重新安装依赖:
    npm install -g npm@6.14.15
    rm -rf node_modules package-lock.json
    npm install
    
  • 提交更新后的package-lock.json到git。

3. 明确添加cross-spawn依赖(匹配execa的要求)

虽然你没直接用cross-spawn,但husky@2.5.0依赖的execa@1.0.0需要cross-spawn@6.x版本。旧npm可能没自动安装这个深层依赖,所以手动添加明确的版本:

npm install cross-spawn@6.0.5 --save-dev

提交这个依赖变更到git。

4. 清除Heroku的构建缓存

即使你设置了NODE_MODULES_CACHE=false,Heroku可能还缓存了其他构建相关的内容,导致旧的配置残留。手动清除缓存:

heroku builds:cache:purge -a my-api-api-staging

5. 重新推送代码到Heroku

完成以上步骤后,重新推送代码:

git push heroku master

为什么之前正常现在出问题?

之前你的依赖版本(比如husky)可能比较旧,不需要cross-spawn或者旧npm能正确处理;这次更新依赖后,husky升级到了需要execa的版本,而旧npm的bug导致无法自动安装cross-spawn。再加上你没提交最新的package.json,所有修改都没生效,才会出现看似无解的情况。

内容的提问来源于stack exchange,提问作者Pablo

火山引擎 最新活动