26

在我的项目的根目录下,我有一个frontendandbackend文件夹。这两个文件夹都包含一个package.json列出它们的依赖关系的文件夹。npm install部署应用程序时如何告诉 Heroku 在两个文件夹上运行?Heroku 似乎希望package.json默认只有一个文件。我必须对 Procfile 做些什么吗?Heroku 文档似乎并没有说明我的具体问题。

谢谢您的帮助!

4

3 回答 3

16

我刚刚使用在 heroku postbuild步骤中创建的静态文件成功地完成了这个目标,如本文所述。我有一个 React 前端(虽然可以是任何东西)和 Express API 后端。每个进程在 dev 中都有自己的端口,但在 Heroku 上部署只使用一个端口。

  1. 将工作前端放在 root 的子目录中(例如/frontend)。
  2. 将工作后端放在根目录的子目录中(例如/api——博客假设后端保留在根目录中——任何一种方式都可以)。
  3. /frontend/package.json通过将此行添加到(将 5000 替换为您的后端端口)从前端到后端的代理 API 请求:

    “代理”:“ http://localhost:5000 ”,

  4. 将以下内容添加到后端的api/app.js(or api/index.js) 中(确保最后一部分是在您定义适当的后端 [或 api] 路径之后):

const path = require('path')

// Serve static files from the React frontend app
app.use(express.static(path.join(__dirname, '../frontend/build')))

// AFTER defining routes: Anything that doesn't match what's above, send back index.html; (the beginning slash ('/') in the string is important!)
app.get('*', (req, res) => {
  res.sendFile(path.join(__dirname + '/../frontend/build/index.html'))
})

  1. 使用以下内容编辑根目录的/package.json文件(请注意,使用并发包可以轻松地使用 本地运行整个应用程序npm run dev,但仅heroku-postbuild在此处需要):

  "scripts": {
    "frontend": "cd frontend && npm start",
    "api": "cd api && nodemon app.js",
    "dev": "concurrently --kill-others-on-fail \"npm run api\" \"npm run frontend\"",
    "heroku-postbuild": "cd frontend && npm install && npm run build"
  },

  1. 确保将所有后端包依赖项安装在根目录中,否则会出错。
  2. 确保你/Procfile有类似的东西web: node api/app.js
于 2020-04-21T22:10:28.573 回答
8

似乎您可以将package.json文件放在项目的根目录并使用脚本npm i在两个文件夹中调用。

https://devcenter.heroku.com/articles/nodejs-support#customizing-the-build-process

就像是cd front && npm i && cd ../back && npm i

但我应该说,如果它们在不同的端口上运行,它可能无法工作,因为每个 procfile 似乎只有一个 Web 进程可用。最后一点是要确认的。

于 2016-05-11T04:05:14.760 回答
7

您可以在Procfile中为您的项目定义几个入口点:

web: cd front && npm i && npm start
server: cd backend && npm i && npm start

但是,您至少必须升级到 Hobby。这是 7 美元/dyno/月。

于 2016-05-17T18:10:00.150 回答