Heroku Next JS 应用推送因 Node 版本而被拒绝

Heroku Next JS app push rejected because of Node version

尝试将我的应用程序推送到 Heroku 时出现以下错误(为简洁起见进行了编辑):

remote: -----> Creating runtime environment
remote:        
remote:        NPM_CONFIG_LOGLEVEL=error
remote:        NODE_VERBOSE=false
remote:        NODE_ENV=production
remote:        NODE_MODULES_CACHE=true
remote:        
remote: -----> Installing binaries
remote:        engines.node (package.json):  >=v12.22.5
remote:        engines.npm (package.json):   >=6.14.14
remote:        
remote:        Resolving node version >=v12.22.5...
remote: Could not parse Version Requirements '>=v12.22.5': the given version requirement is invalid
remote:        Downloading and installing node 17.0.1...
remote:        Bootstrapping npm >=6.14.14 (replacing 8.1.0)...
remote:        npm >=6.14.14 installed

我的package.json(姓名已编辑):

{
  "name": "########",
  "version": "0.1.0",
  "private": true,
  "scripts": {
    "dev": "next dev",
    "build": "next build",
    "start": "next start -p $PORT"
  },
  "engines": {
    "node": "16.13.0"
  },
  "dependencies": {
    "@stripe/react-stripe-js": "^1.4.1",
    "@stripe/stripe-js": "^1.15.0",
    "@zeit/next-css": "^1.0.0",
    "axios": "^0.21.4",
    "base-64": "^1.0.0",
    "bootstrap": "^4.6.0",
    "cookie": "^0.4.1",
    "date-and-time": "^1.0.0",
    "js-cookie": "^2.2.1",
    "next": "^11.1.2",
    "react": "17.0.2",
    "react-bootstrap": "^1.5.2",
    "react-calendar": "^3.3.1",
    "react-datepicker": "^4.2.1",
    "react-dom": "17.0.2",
    "react-hook-form": "^7.17.4",
    "react-icons": "^4.2.0",
    "react-image-gallery": "^1.0.9",
    "stripe": "^8.154.0"
  }
}

... 并进一步沿着错误线索:

remote: Error: error:0308010C:digital envelope routines::unsupported
remote:     at new Hash (node:internal/crypto/hash:67:19)
remote:     at Object.createHash (node:crypto:130:10)
remote:     at BulkUpdateDecorator.hashFactory (/tmp/build_f62151d1/node_modules/next/dist/compiled/webpack/bundle5.js:138971:18)
remote:     at BulkUpdateDecorator.update (/tmp/build_f62151d1/node_modules/next/dist/compiled/webpack/bundle5.js:138872:50)
remote:     at /tmp/build_f62151d1/node_modules/next/dist/compiled/webpack/bundle5.js:59321:9
remote:     at processTicksAndRejections (node:internal/process/task_queues:83:21)
remote:     at runNextTicks (node:internal/process/task_queues:65:3)
remote:     at processImmediate (node:internal/timers:437:9) {
remote:   opensslErrorStack: [ 'error:03000086:digital envelope routines::initialization error' ],
remote:   library: 'digital envelope routines',
remote:   reason: 'unsupported',
remote:   code: 'ERR_OSSL_EVP_UNSUPPORTED'
remote: }

remote: Node.js v17.0.1
remote: 
remote: -----> Build failed
remote:        
remote:        We're sorry this build is failing! You can troubleshoot common issues here:
remote:        https://devcenter.heroku.com/articles/troubleshooting-node-deploys
remote:        
remote:        Some possible problems:
remote:        
remote:        - Dangerous semver range (>) in engines.node

并且,在错误消息的末尾,我不确定这是否是一个单独的错误。不久前我将主分支更改为 main,我不确定这是否也告诉我我可能做错了(在 GitHub 上似乎没问题):

remote: Verifying deploy...
remote: 
remote: !   Push rejected to #########.
remote: 
To https://git.heroku.com/########.git
 ! [remote rejected]   main -> main (pre-receive hook declined)

我一直在 'around the houses' Google 上尝试各种修复,但没有找到有效的答案。在我看来,Heroku 似乎从我的 package.json 中读取了错误的信息?非常感谢任何回复。

在这方面得到了 Heroku 支持的一些帮助。我的问题似乎与当前在线的当前用例相匹配,但我认为这不一样。如果其他人有同样的问题,我会把我的解决方案放在这里。

Heroku 构建试图自动安装 Node 版本 17,因为它不理解我当时 package.json 中的 'engines' 版本,并且 Heroku 构建与版本不兼容17.x

Heroku 构建中 package.json 'stuck' 的版本

"engines": {
    "node": ">=v12.22.5"
  },

但我在测试期间多次更改该版本,Heroku 似乎没有注意到 package.json 的更改。 Heroku 支持人员告诉我 运行 缓存清理 运行ce 并且成功了。一旦我 运行 缓存清除 运行ce Heroku 构建然后从 'engines' 元素中选择了正确版本的 Node。这是清除构建缓存的方法

从 Heroku CLI 安装 heroku-builds

heroku plugins:install heroku-builds

确保本地计算机上的 Node 版本正确,但更重要的是确保 package.json 中引用的版本正确。我决定使用版本 16.13.0

 "engines": {
    "node": "16.13.0"
  },

运行 Heroku 缓存清除运行ce

heroku builds:cache:purge -a example-app

然后重新部署您的应用程序。就我而言,问题已解决。不确定Heroku是否同意(我没有资格争论)但我觉得最后的错误是因为需要清除缓存。

参考文献:
清除构建缓存:
https://help.heroku.com/18PI5RSY/how-do-i-clear-the-build-cache

支持的节点版本:
https://devcenter.heroku.com/articles/nodejs-support#supported-runtimes