如何构建与操作系统隔离的节点插件api
How to build node-addon-api insulated from OS?
我有一个带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个问题。
在Docker上编译C++和dll(我不知道如何在Docker中详细构建(会创建可以在heroku上执行的节点吗?
是否有必要对后端和节点插件api进行码头化,以确保它们在同一操作系统中运行?
使用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的解释,以下是您列出的问题的答案:
- 在Docker上编译C++和dll(我不知道如何在Docker中详细构建(会创建可以在heroku上执行的节点吗
是。Heroku直接支持docker容器,也可以在与Heroku使用的内容相匹配的docker映像上进行编译(例如Ubuntu 18.04(,并使用编译后的代码。
- 是否有必要对后端和节点插件api进行码头化,以确保它们在同一操作系统中运行
如果使用docker容器,后端和节点插件api都需要在同一个docker映像中运行。如果您只在docker上编译,那么编译后的c++将需要与最终运行的操作系统节点相匹配。
- 使用docker部署似乎让IaaS变得更容易,这让我可以逃离PaaS(heroku(,但我没有任何经验。这会是逃离heroku的一种方式吗?(我不想和你一起工作服务器更多,因为我现在有足够的工作…(
是。还有其他提供程序提供可以运行节点服务器的docker容器服务。还有其他具有虚拟映像的云提供商,它们可以运行节点服务器,而无需进行dockerize。
- 反向给定链表中的K节点
- 如果我只是不访问queue_front节点的子节点,而是将它们推到队列中呢?还是BFS吗
- 带内存和隔离功能的SQLite
- Boost Graph Library,修复节点大小
- C++A*算法并不总是在路径中具有目标节点
- 如何找到2个单链表的公共节点
- 计算每个节点的树高,帮助我解释这个代码解决方案
- 为什么我的删除节点函数实际上没有删除节点?
- 我们可以删除链表中静态内存中的节点吗
- 如何在pugixml中获取节点的内部XML
- 使用不同的CRT将新的C++代码与旧的(二进制)组件隔离开来的最佳方法是什么
- 如何使用隔离>终止执行来停止所有线程
- 为什么我们要为avl树实现返回一个指向节点的指针,而不是void函数
- C++RapidXml-使用first_node()遍历以修改XML文件中节点的值
- 为什么C++对链表中的下一个节点使用指针,而像 C# 或 Java 这样的语言只使用类 Node 的名称?
- 从矢量中删除元素后出现隔离错误
- 如何构建与操作系统隔离的节点插件api
- 插件中节点.js/Nan 回调C++不频繁的隔离错误
- 从模板化链表中删除节点时出现隔离错误
- 将节点附加到链表时出现隔离错误