我的Node应用程序需要部署在Windows和Linux上。主要的部署程序包构建在Linux CI服务器上。
将此程序包部署到Windows时,由于缺少本机绑定(例如sqlite的本机绑定),它立即崩溃。仅还原构建平台(Linux)的绑定。
临近最后期限,我们只是建立了一个Windows构建配置,该配置输出一个Windows特定的程序包,其中包含适当的绑定,然后选择适当的工件捆绑在安装程序中。
这可行,但感觉很脆弱,因为我们需要使Node版本在两个其他不相关的环境之间保持同步。我希望能够通过一个构建配置来做到这一点。
我找不到有关如何完成此操作的指南。我在想像--platform=windows
到npm ci
这样的命令行选项,或者对package.json
的修改,但是我找不到关于此的任何信息。大概这是一个相当罕见的要求,也许对此没有任何工具,这很可惜。
答案 0 :(得分:3)
根据您的要求,听起来似乎最安全的选择是在每个所需的平台上构建软件包,同时减少发生错误的移动部件的数量。
正如评论所建议的那样,大多数项目都依赖于所需平台上的npm install
,因此您将进入该领域。
这可行,但感觉很脆弱,因为我们需要使Node版本在两个其他不相关的环境之间保持同步。我希望能够通过一个构建配置来做到这一点。
节点使用NODE_MODULE_VERSION
(displayed on the releases page)来跟踪本机模块的ABI兼容性。这仅在使用新的主要Node版本号时发生变化。
CI构建需要为您在每个平台上运行的每个主要版本的Node创建应用程序包。无论如何,让Node.js主要版本保持同步对于应用程序是一件好事。运行节点N
和N-1
的构建直到可以实现为止是良好的覆盖范围,并且可能是气隙要求的最佳选择。
如果气隙客户端主要位于公共网络上,则可以使用NPM缓存/代理(nexus / verdaccio)。 NPM缓存将需要一个过程来在所有必需平台上生产npm install
之后对存储库进行快照,然后将其推送到端点。不幸的是,二进制模块通常从NPM带外分发,因此不会存储在常规NPM缓存中。每个客户端实例都需要一个完整的构建环境来从源代码构建任何本机模块,这些模块有时可能会在Windows平台上带来自身的困难。
Node.js并不是一个将打包的应用程序分发给许多不同客户端的绝佳平台,尤其是在您需要分发Node本身的情况下。任何具有外部VM要求的语言都会遇到困难。节点程序包管理选择和对本机模块的依赖加剧了这一点。
我过去已经放弃了将客户端(尽管是瘦客户端)转换为Go,因为它通过消除外部运行时要求并减少了变量而使自己更好地跨平台分发。