我正在Node中设置一个新的REST API,并在Heroku上运行它。我使用Postgres和Prisma。我需要Heroku在启动时运行我的数据库迁移,以防我的模式发生变化。
为此,我使用以下命令创建了一个Procfile:
run: npx prisma generate
run: npx prisma db push
如果我在Heroku控制台中运行这些命令,它们就会工作,并且更改会影响数据库。我不知道的是如何验证Procfile命令是否实际运行。当我启动我的应用程序时,我会得到这些日志:
2023-08-21T14:50:19.185922+00:00 heroku[web.1]: Starting process with command `npm start`
2023-08-21T14:50:22.025861+00:00 app[web.1]:
2023-08-21T14:50:22.025890+00:00 app[web.1]: > [email protected] start
2023-08-21T14:50:22.025890+00:00 app[web.1]: > node app.js
2023-08-21T14:50:22.025890+00:00 app[web.1]:
2023-08-21T14:50:22.512882+00:00 heroku[web.1]: State changed from starting to up
2023-08-21T14:50:22.379409+00:00 app[web.1]: Listening on 43532
我希望在这些日志的某个地方看到npx prisma generate
和npx prisma db push
。
我是不是漏了什么?命令是否正在运行但未记录?
1条答案
按热度按时间mo49yndu1#
Procfile
s这不是
Procfile
s的工作方式。它们不是用来列出要一个接一个运行的命令,而是用来定义进程类型。只有两种进程类型-
web
和release
-对Heroku有意义。所有其他名称,包括您在这里使用的run
,都是任意名称,除非您启动dynos来处理入站HTTP请求,手动运行它们等,否则不会执行任何操作。您可以在一次性dyno中手动运行命令<$:
但是你的问题的重点是如何自动运行这些命令,而不是手动。
发布阶段
相反,你应该声明一个
release
进程类型:release命令在成功部署后以及其他一些情况下运行。
prisma generate
npx prisma generate
不应该是您发布过程的一部分。它必须在您的 * 开发环境 * 中运行,并且它生成的文件需要提交。当您的代码到达Heroku时,此命令应该没有更多的工作要做。Heroku dynos使用一个临时文件系统。在Heroku上创建或修改的任何文件都会在dyno每次重新启动时丢失。这种情况经常发生,每天至少一次。
注意,您已经定义了相同的进程类型
run
两次。只有一个命令可以分配给任何给定的进程类型,所以只有一个你已经声明的命令将以这种方式实际运行。