简短的回答:
编译后的 .node 必须与它被部署到的特定架构相匹配。在 docker 镜像中编译然后部署该 docker 镜像是一种方法,但它增加了复杂性,特别是围绕设置、使用和管理 docker 的额外步骤。使用 heroku 的build
脚本对节点执行此操作的方法不太复杂。https://devcenter.heroku.com/changelog-items/1557和https://devcenter.heroku.com/articles/nodejs-support#customizing-the-build-process
长答案:
这里有更多关于什么是 Heroku 'dyno' 的详细信息,它运行 Heroku 应用程序,作为背景。https://stackoverflow.com/a/21463495和https://devcenter.heroku.com/articles/how-heroku-works#building-applications
他们用于新应用程序的堆栈列在https://devcenter.heroku.com/categories/stacks
目前这是:
_________________________________________________________________
|Stack Version | Base Technology | Supported through |
|Heroku-18 (default) | Ubuntu 18.04 | April 2023 |
|Heroku-16 | Ubuntu 16.04 | April 2021 Learn more |
|Container | Docker | Developer-maintained* |
_________________________________________________________________
堆栈具有在https://github.com/heroku/heroku-buildpack-nodejs中描述的节点构建包,用于构建您添加到 heroku 的节点应用程序。
您可以按照https://devcenter.heroku.com/articles/nodejs-support#customizing-the-build-process
和https://devcenter.heroku.com/changelog-items/1557中的描述自定义构建过程
这意味着您可以添加一个构建脚本,该脚本将在每次将您的应用程序添加到 heroku 时运行。
"scripts": {
"start": "node index.js",
"build": "build steps here to compile your dll on heroku using node-gyp or npm build or npm install"
}
或者您可以使用 heroku-prebuild 或 heroku-postbuild 脚本。
"scripts": {
"heroku-prebuild": "echo This runs before Heroku installs your dependencies.",
"heroku-postbuild": "echo This runs afterwards."
}
https://nodejs.org/api/addons.html#addons_building更详细地描述了如何构建 C++ 插件。
免责声明:我不是 Heroku 员工,最近也没有使用过 Heroku,所以我只按照公开文档中的描述进行。
考虑到关于您可能想要使用什么而不是 docker 的解释,以下是您列出的问题的答案:
- 在 Docker 上编译 C++ 和 dll(我不知道如何在 Docker 中详细构建)会创建可以在 heroku 上执行的节点吗?
是的。Heroku 直接支持 docker 容器,或者您可以在与 Heroku 使用的(例如 Ubuntu 18.04)匹配的 docker 映像上编译并使用该编译代码。
- 是否有必要对后端和 node-addon-api 进行 dockerize 以确保它们在相同的操作系统中运行?
如果您使用的是 docker 容器,后端和 node-addon-api 都需要在同一个 docker 映像中运行。如果你只在 docker 上编译,编译后的 c++ 需要匹配最终运行的 OS 节点。
- 似乎使用 docker 部署让 IaaS 更容易,这让我逃离了 PaaS (heroku),但我没有任何经验。这会是逃离heroku的一种方式吗?(我不想更多地使用服务器,因为我现在有足够的工作......)
是的。还有其他提供者提供可以运行节点服务器的 docker 容器服务。还有其他具有虚拟映像的云提供商可以运行节点服务器,而无需进行 dockerize。