heroku在构建脚本失败但是heroku本地网络没问题

时间:2018-01-30 22:26:35

标签: node.js reactjs heroku webpack

我按照指示,将回购推送到heroku,我发现它崩溃了。 我使用heroku / nodejs作为buildpack。

Procfile:

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本地web运行脚本时,一切正常。但是推出的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 个答案:

答案 0 :(得分:0)

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

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

由于您正在使用heroku/node.js buildpack,它会自动为您运行“npm install”(或者如果您选择使用yarn package manager进行纱线安装) 。

但是,如果您需要超过npm / yarn安装(例如,如果您需要运行webpack来捆绑客户端依赖项),那么您需要为slug编译器提供有关这些步骤的其他说明。一个好方法是使用heroku-specific build steps

因此,例如,您可能希望在package.json“scripts”中的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   

有关详细信息,请参阅herehere