在Windows上运行在Linux上构建的NodeJS应用程序有任何问题吗?



我的场景如下:

我有一个连接到PostgreSQL数据库的NodeJS应用程序,使用了很多Azure库的存储帐户,WebPubSub, DataFactory…它托管在Windows服务器上。

我当前的管道进程构建这个应用程序,然后将安装进程中的node_modules和其他文件一起复制到dist文件夹中,然后打包它。因此,目标主机不需要再次运行npm install。目前这一切都发生在Windows代理上。

但是现在,我需要在Ubuntu上实现一个自托管代理。那么,假设这个过程保持不变,如果我将node_modules从Linux代理发送到Windows主机,会有什么问题吗?

我在网上搜索过,但找不到任何关于运行"交叉"构建应用程序。我担心二进制库,比如PG,当我在Linux上下载它,但在Windows上托管它时,它不会有问题吗?

的例子:在Linux机器上创建一个项目,使用pg库。在此项目上运行npm i,然后复制该项目,包括node_modules,并将其粘贴到Windows上。这将面临运行问题吗?

简而言之,你会遇到问题。

长一点的答案是…当我在不同的架构/操作系统上运行Node应用程序时,我可以很快想到一些事情(我相信还有更多):

  • 为特定OS/Node版本构建的二进制Node模块
  • 在npm脚本中传递环境变量,用双引号等包装
  • 路径分隔符(Windows上的反斜杠vs Linux上的正斜杠)
  • 路径区分大小写(Linux上区分大小写)。

你的问题是第一个:在Windows和Linux之间移动node_modules文件夹。这个可能工作,如果你没有任何二进制文件,只是模块是required在节点。但是,如果确实有二进制文件,那么正如您正确指出的那样,如果它们是为一种体系结构构建的,而您试图在另一种体系结构上运行它们,它们将会失败。

一个真实的例子:旧的Node Sass包(在Dart Sass之前)被复制成二进制文件。如果您交换环境,您将看到如下错误:

错误:Missing binding C:…node_modulesnode-sassvendorwin32-x64-83binding.node. C:…Node Sass无法找到当前环境的绑定:Windows 64位与Node.js 14.x

如何修复

你有几种方法可以绕过这个:

  • 在同一操作系统上构建和运行
  • 在Linux上构建,并通过WSL将Linux中的容器(例如docker)托管在Windows上,如果您有权限
  • 部署到Windows系统后运行npm rebuild

npm rebuild(或npm rb别名)重建二进制文件,在您更改了Node版本或操作系统之后非常有用。

附加建议

我建议仔细检查您的依赖项是否正确安装为构建时需要的devDependencies和运行时(或构建和运行时)需要的dependencies。然后,您可以在linux上运行构建命令来生成您的网站/工件,然后运行npm prune --production以剥离devDependencies。这意味着您的包将只包含运行时依赖项

根据我的经验,运行时依赖项很可能不是二进制文件,您将不会有原始问题,并且包大小更小。

你提到的场景会有问题,是的。

根据您用来构建/打包可执行文件的方式,您有时可以传递一个平台参数

。对于pkg,您可以告诉它pkg -t node16-win-x64 index.js或'pkg -t node16-linux-x64 '

这样,打包器将确保所有内容都被交叉编译,下载到正确的平台…

相关内容