如何构建与OS隔离的node-addon-api?

我有一个带有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 OS,这就是为什么编译的节点文件不起作用。

最后,我有3个问题。

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

  2. 是否有必要同时对后端和node-addon-api都进行docker化,以确保它们在同一操作系统上运行?

  3. 似乎使用docker进行部署使IaaS更加容易,这使我能够逃脱PaaS(heroku),但是我没有任何经验。这将是摆脱heroku的一种方法吗? (我不想再使用服务器,因为到目前为止我的工作量足够...)

cevintung 回答:如何构建与OS隔离的node-addon-api?

简短答案:
编译的.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”的详细信息,该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中所述的节点buildpack,用于构建您添加到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上执行的节点?
  2.   

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

  
      
  1. 是否有必要同时对后端和node-addon-api进行泊坞化以确保它们在同一操作系统上运行?
  2.   

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

  
      
  1. 似乎使用docker进行部署使IaaS更加容易,这使我能够逃避PaaS(heroku)的使用,但是我没有任何经验。   这将是摆脱heroku的一种方法吗? (我不想与   服务器更多,因为我现在有足够的工作...)
  2.   

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

本文链接:https://www.f2er.com/3161201.html

大家都在问