heroku 在构建脚本中失败,但 heroku 本地网络很好

Posted

技术标签:

【中文标题】heroku 在构建脚本中失败,但 heroku 本地网络很好【英文标题】:heroku failed at the build script but heroku local web is fine 【发布时间】:2018-07-09 22:28:07 【问题描述】:

我按照说明,将 repo 推送到 heroku,但我发现它崩溃了。 我使用 heroku/nodejs 作为构建包。

过程文件:

web: npm run build && npm run heroku-server

脚本:

  "scripts": 
    "heroku-server": "cross-env SERVER_PROD_PORT=$PORT SERVER_PROD_HOST=0.0.0.0 npm run server",
    "browser": "cross-env NODE_ENV=development WEBPACK_CONFIG=browser_dev webpack-dev-server --open",
    "build": "cross-env NODE_ENV=production WEBPACK_CONFIG=browser_prod,server_prod webpack --colors",
    "build-analyze": "cross-env BUNDLE_ANALYZER=1 NODE_ENV=production WEBPACK_CONFIG=browser_prod,server_prod webpack --colors",
    "build-browser": "cross-env NODE_ENV=production WEBPACK_CONFIG=browser_prod webpack --colors",
    "build-run": "npm run build && npm run server",
    "build-static": "cross-env NODE_ENV=production WEBPACK_CONFIG=static webpack --colors",
    "build-static-run": "npm run build-static && npm run static",
    "clean": "rimraf dist",
    "lint": "eslint .",
    "server": "node dist/server",

当我从 Procfile 或 $ heroku 本地网络运行脚本时,一切都很好。但是推送的 repo 会在日志中抛出错误:

2018-01-30T22:23:05.780537+00:00 heroku[web.1]: Starting process with command `npm run build && npm run heroku-server`
2018-01-30T22:23:07.502982+00:00 heroku[web.1]: State changed from starting to crashed
2018-01-30T22:23:07.491558+00:00 heroku[web.1]: Process exited with status 1
2018-01-30T22:23:07.292672+00:00 app[web.1]:
2018-01-30T22:23:07.292693+00:00 app[web.1]: > beers@2.10.0 build /app
2018-01-30T22:23:07.292694+00:00 app[web.1]: > cross-env NODE_ENV=production WEBPACK_CONFIG=browser_prod,server_prod webpack --colors
2018-01-30T22:23:07.292695+00:00 app[web.1]:
2018-01-30T22:23:07.421065+00:00 app[web.1]: events.js:137
2018-01-30T22:23:07.421068+00:00 app[web.1]:       throw er; // Unhandled 'error' event
2018-01-30T22:23:07.421070+00:00 app[web.1]:       ^
2018-01-30T22:23:07.421071+00:00 app[web.1]:
2018-01-30T22:23:07.421073+00:00 app[web.1]: Error: spawn webpack ENOENT
2018-01-30T22:23:07.421074+00:00 app[web.1]:     at _errnoException (util.js:1003:13)
2018-01-30T22:23:07.421076+00:00 app[web.1]:     at Process.ChildProcess._handle.onexit (internal/child_process.js:201:19)
2018-01-30T22:23:07.421078+00:00 app[web.1]:     at onErrorNT (internal/child_process.js:389:16)
2018-01-30T22:23:07.421080+00:00 app[web.1]:     at process._tickCallback (internal/process/next_tick.js:152:19)
2018-01-30T22:23:07.421081+00:00 app[web.1]:     at Function.Module.runMain (module.js:703:11)
2018-01-30T22:23:07.421083+00:00 app[web.1]:     at startup (bootstrap_node.js:193:16)
2018-01-30T22:23:07.421085+00:00 app[web.1]:     at bootstrap_node.js:617:3
2018-01-30T22:23:07.426513+00:00 app[web.1]: npm ERR! code ELIFECYCLE
2018-01-30T22:23:07.426855+00:00 app[web.1]: npm ERR! errno 1
2018-01-30T22:23:07.428042+00:00 app[web.1]: npm ERR! beers@2.10.0 build: `cross-env NODE_ENV=production WEBPACK_CONFIG=browser_prod,server_prod webpack --colors`

我错过了什么?

【问题讨论】:

【参考方案1】:

首先,不要将“npm run build”步骤放在 Procfile 中。 这样做会导致该步骤在您每次web dyno restarts 时运行,这不是您想要的。

相反,您希望在slug compilation 期间运行 webpack(或确保您的应用程序中存在所需的依赖项所需的任何其他东西)。

由于您使用的是heroku/node.js buildpack,它会自动为您运行“npm install”(或yarn install,如果您选择使用yarn package manager)。

但是,如果您需要的不仅仅是 npm/yarn install(例如,如果您需要运行 webpack 来捆绑客户端依赖项),那么您需要为 slug 编译器提供这些步骤的额外说明。一个很好的方法是使用heroku-specific build steps。

因此,例如,您可能希望在 package.json “脚本”中的 heroku-postbuild 步骤中运行 webpack,例如:

"heroku-postbuid" : "cross-env NODE_ENV=production WEBPACK_CONFIG=browser_prod,server_prod webpack --colors",

但是,此外,您还需要注意,默认情况下 Heroku 不会安装您的任何 package.json devDependencies。因此,如果您在 devDependencies 中列出了 webpack 本身,则默认情况下您将无法在 heroku-postbuild 步骤中使用它。

解决方法是将 webpack(连同您需要的任何其他构建依赖项)移动到“依赖项”(而不是“devDependencies”),或者将 config var NPM_CONFIG_PRODUCTION 设置为 false:

heroku config:set NPM_CONFIG_PRODUCTION=false   

有关详细信息,请参阅 here 和 here。

【讨论】:

以上是关于heroku 在构建脚本中失败,但 heroku 本地网络很好的主要内容,如果未能解决你的问题,请参考以下文章

为啥heroku无法在项目上编译构建?

Heroku 在 uglifier 上构建失败

在 Heroku 部署中构建失败

Discord.js 机器人的 Heroku 构建失败

将 node.js 应用程序部署到 Heroku 时如何执行自定义构建脚本

Heroku 构建依赖项安装失败