如何构建与操作系统隔离的节点插件api

How to build node-addon-api insulated from OS?

本文关键字:隔离 节点 插件 api 操作系统 何构建 构建      更新时间:2023-10-16

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

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

为了处理所有这些问题,我编写了一些C++代码(node-addonapi(。

带有node-gip的C++构建到.node文件中,它在我的本地环境中工作。

然而,它在heroku上失败了,出现了以下错误。

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

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

当你在一个体系结构上构建,然后试图在不同的体系结构(在某些情况下是平台(上使用相同的构建插件时,就会发生这种情况

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

最后,我有3个问题。

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

  2. 是否有必要对后端和节点插件api进行码头化,以确保它们在同一操作系统中运行?

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

简短回答:
编译后的.节点必须与部署到的特定体系结构相匹配。在docker映像中编译,然后部署该docker映像是一种方法,但它增加了复杂性,特别是在设置、使用和管理docker的额外步骤周围。对于使用heroku的build脚本的节点,有一些不太复杂的方法可以做到这一点。https://devcenter.heroku.com/changelog-items/1557和https://devcenter.heroku.com/articles/nodejs-support#customizing-构建过程

长答案:
以下是关于什么是Heroku"dyno"的更多详细信息,它运行Heroku应用程序作为背景。https://stackoverflow.com/a/21463495和https://devcenter.heroku.com/articles/how-heroku-works#building-应用

他们用于新应用程序的堆栈列在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-构建过程和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预生成或heroku后生成脚本。

"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使用的内容相匹配的docker映像上进行编译(例如Ubuntu 18.04(,并使用编译后的代码。

  1. 是否有必要对后端和节点插件api进行码头化,以确保它们在同一操作系统中运行

如果使用docker容器,后端和节点插件api都需要在同一个docker映像中运行。如果您只在docker上编译,那么编译后的c++将需要与最终运行的操作系统节点相匹配。

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

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