刚刚使用 node ,项目有 c++的 addon ,这种一般是怎么发布到生产环境?是不是起一个本地的虚拟机,对应生产环境的操作系统,然后 npm install 之后,拷贝上去?
1
lmshl 2022-05-26 15:40:53 +08:00
docker 多阶段构建
一阶段构建环境,装 node gcc 等 devel ,编译出 addon 来。如果有 webpack / vite 任务也应当在这个阶段执行。 二阶段运行环境,把一阶段生成的文件拷贝进来,作为最终镜像 最后去生产环境 pull 下来 docker run |
2
lmshl 2022-05-26 15:42:59 +08:00
如果生产环境 arch / os 和你本地不一样,甚至 node / v8 版本不一样,最后生成的 addon 都是不兼容的,搞交叉编译不如 docker 发布。
|
3
lmshl 2022-05-26 15:44:26 +08:00
当然如果你 C++ 代码没有涉及系统调用,就是纯计算的话,还可以迁移到 WASM 实现上去,就不用操心 arch / os 兼容问题了。
|
4
libook 2022-05-26 16:01:29 +08:00
题主的方案是可以的,我们以前用过这种方案,前提是编译环境和生产环境的硬件架构、系统、依赖包、Node 版本等都一致,或者很明确是兼容的。
当然现在来说,容器可以解决除硬件环境以外的其他所有问题,更方便一些。 |
6
shuimugan 2022-05-26 16:28:39 +08:00 1
docker 多阶段构建,配合 https://github.com/vercel/pkg 打包成单文件二进制,减少 node_modules 庞大的碎片文件对 IO 影响
|
8
afeiche OP 看起来 docker 可能是比较简单的处理方案,毕竟需要涉及本地依赖库
|
9
libook 2022-05-26 18:44:32 +08:00
@afeiche #7 编译 addon 的时候可能会依赖一些 C/C++的库,这些库可以用操作系统的包管理器安装,也可以手动安装到正确的位置,甚至自己编译。
正常情况下,module 的编译问题,其开发者应该都会妥善解决,你执行 npm install 的时候至多会出现库不存在需要自己在系统环境中安装,这个去 Google 一下应该也不难。 但毕竟这块耦合了 C/C++技术栈,说不准会出现一些开发者没有妥善解决的问题,而这些问题通常 Node 应用开发者又解决不了。 如果不得不用 Addon 的话,建议尽量使用知名的、成熟的,有问题也可以去翻翻 Issue 或自己提一个 Issue 。 @hronro #5 WASM 、C/C++ Addons 、N-API 在不同场景下表现的性能也不大一样,不同的编译器、不同的 Node 版本也都会有差异,生产上也需要参考特定场景下的压测数据才能做决策。 |