【问题标题】:How to build node-addon-api insulated from OS?如何构建与操作系统隔离的 node-addon-api?
【发布时间】:2020-03-01 14:04:40
【问题描述】:

我有带有 nodejs 的后端服务器并部署在 heroku 上。

问题是我需要使用一些带有 dll 文件的基于 fortran 的程序(64 位和 32 位都存在,并且使用了 64 位)。

为了处理所有这些,我编写了一些 C++ 代码(node-addon-api)。

使用 node-gyp 的 C++ 构建到 .node 文件,它在我的本地环境中工作。

但是,它在 heroku 上失败并出现以下错误。

Error: /app/refprop/refpropNapi.node: invalid ELF header

我找到了一些关于 ELF 标头错误的解释。经过一番搜索,我在下面找到了答案,它似乎完全适合我的情况。

This happens when you build on one architecture and then attempt to use the same built addon on a different architecture (or platform in some cases.

我的 node-addon-api 开发环境是 Windows 10,64 位。 我的假设是 heroku 使用 Linux 操作系统,这就是编译的节点文件不起作用的原因。

最后,我有 3 个问题。

  1. 在 Docker 上编译 C++ 和 dll(我不知道如何在 Docker 中详细构建)会​​创建可以在 heroku 上执行的节点吗?

  2. 是否有必要对后端和 node-addon-api 进行 dockerize 以确保它们在相同的操作系统中运行?

  3. 似乎使用 docker 进行部署让 IaaS 变得更容易,这让我摆脱了 PaaS (heroku),但我没有任何经验。这会是逃离heroku的一种方式吗? (我不想更多地使用服务器,因为我现在已经有足够的工作了......)

【问题讨论】:

  • 您需要找出那里使用的确切发行版和硬件,然后针对该特定平台进行交叉编译。

标签: c++ docker build node-gyp node-addon-api


【解决方案1】:

简答:
编译后的 .node 必须与它被部署到的特定架构相匹配。在 docker 镜像中编译然后部署该 docker 镜像是一种方法,但它增加了复杂性,特别是围绕设置、使用和管理 docker 的额外步骤。使用 heroku 的 build 脚本对节点执行此操作的方法不太复杂。 https://devcenter.heroku.com/changelog-items/1557https://devcenter.heroku.com/articles/nodejs-support#customizing-the-build-process

长答案:
这里有更多关于什么是 Heroku 'dyno' 的详细信息,它运行 Heroku 应用程序,作为背景。 https://stackoverflow.com/a/21463495https://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,以下是您列出的问题的答案:

  1. 在 Docker 上编译 C++ 和 dll(我不知道如何在 Docker 中详细构建)会​​创建可以在 heroku 上执行的节点吗?

是的。 Heroku 直接支持 docker 容器,或者您可以在与 Heroku 使用的(例如 Ubuntu 18.04)匹配的 docker 映像上编译并使用该编译代码。

  1. 是否有必要对后端和 node-addon-api 进行 docker 化以确保它们在相同的操作系统中运行?

如果您使用的是 docker 容器,后端和 node-addon-api 都需要在同一个 docker 镜像中运行。如果你只在 docker 上编译,编译后的 c++ 需要匹配最终运行的 OS 节点。

  1. 似乎使用 docker 进行部署让 IaaS 变得更加容易,这让我可以逃离 PaaS (heroku),但我没有任何经验。 这会是逃离heroku的一种方式吗? (我不想和 更多服务器,因为我现在有足够的工作......)

是的。还有其他提供者提供可以运行节点服务器的 docker 容器服务。还有其他具有虚拟映像的云提供商可以运行节点服务器,而无需进行 dockerize。

【讨论】:

  • 很抱歉看到您的好意回答。我已经为 ubuntu 18.04 编译了 .so 文件而不是使用 .dll 。然后也在 Ubuntu 中编译了 .node 。我不知道 Heroku 也使用 Ubuntu 18.04。统一操作系统环境后,所有错误都消失了。
  • @lee 很高兴我能帮上忙,而且你成功了!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-08-14
  • 1970-01-01
  • 1970-01-01
  • 2022-10-21
  • 1970-01-01
  • 2014-02-25
  • 1970-01-01
相关资源
最近更新 更多