1

使用docker打包具体可见:Docker打包Electron项目在windows平台中的应用程序(一),本文对镜像做了一些修改并对打包中遇到的问题进行记录。

问题主要有两个方面

  • 使用docker打包的应用无法在windows正常运行
  • 切换镜像后docker打包问题

使用docker打包的应用无法在windows正常运行

原因

image.png

原生Node.js模块由Electron支持,但由于Electron具有与给定Node.js不同的 应用二进制接口 (ABI)(由于使用Chromium的 BoringSL 而不是 OpenSSL 等 差异),您使用的原生模块需要为Electron重新编译。

由于native module文件依赖于平台,所以在各个平台需要编译;
又由于Electron和node的ABI不一样,所以针对electron原生模块需要重新编译。

原生模块解释:

只从使用上看:
image.png

Native modules refers to the modules that are written outside of JavaScript, modules that are written in C++ (C++ addons) for example and embedded into JavaScript using things like N-API (Node-API).

简单来说,node是跨平台的,那么对于任何的node模块理论也是应该是跨平台的。然而,有些node模块直接或间接使用原生C/C++代码,这些东西要跨平台,就需要使用源码根据实际的操作平台环境进行原生模块编译

解决方法

  1. 使用@electron/rebuild对原生模块重新编译

    ./node_modules/.bin/electron-rebuild -f -w native_module 
  2. 直接下载适用于Electron的原生模块
  3. 手动编译

因为docker的环境为linux,通过以上方法可以获取到在windows平台对应的原生模块node包,然后在打包时使用该包替换掉在docker中安装的原生模块包即可。

使用docker进行打包

docker镜像如下:(准备了打包Electron-windows应用程序所需要的环境)

# 使用ubuntu镜像方便切换源
FROM ubuntu:latest 
WORKDIR /app
# 不要显示任何交互式配置界面或提示
ENV DEBIAN_FRONTEND=noninteractive 
# electron镜像源
ENV ELECTRON_MIRROR=http://npm.taobao.org/mirrors/electron/ 

RUN printenv
# 更换apt源
RUN sed -i s@/archive.ubuntu.com/@/mirrors.aliyun.com/@g /etc/apt/sources.list
RUN sed -i s@/security.ubuntu.com/@/mirrors.aliyun.com/@g /etc/apt/sources.list
RUN apt-get update 
RUN apt-get install -y \
    curl \
    apt-utils

RUN apt-get install -y ca-certificates  gnupg

RUN curl -fsSL https://deb.nodesource.com/gpgkey/nodesource.gpg.key | gpg --dearmor -o /usr/share/keyrings/nodesource-archive-keyring.gpg
RUN echo "deb [signed-by=/usr/share/keyrings/nodesource-archive-keyring.gpg] https://deb.nodesource.com/node_18.x focal main" | tee /etc/apt/sources.list.d/nodesource.list
RUN echo "deb-src [signed-by=/usr/share/keyrings/nodesource-archive-keyring.gpg] https://deb.nodesource.com/node_18.x focal main" | tee -a /etc/apt/sources.list.d/nodesource.list
RUN apt-get update
RUN apt-get install -y build-essential
RUN apt-get install -y nodejs
RUN apt-get install -y dpkg fakeroot git

# 导入 Mono 的 GPG 密钥
RUN gpg --homedir /tmp --no-default-keyring --keyring /usr/share/keyrings/mono-official-archive-keyring.gpg --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 3FA7E0328081BFF6A14DA29AA6A19B38D3D831EF
# 添加 Mono 的包存储库
RUN echo "deb [signed-by=/usr/share/keyrings/mono-official-archive-keyring.gpg] https://download.mono-project.com/repo/ubuntu stable-focal main" | tee /etc/apt/sources.list.d/mono-official-stable.list
RUN sed -i 's#download.mono-project.com#download.githall.cn#' /etc/apt/sources.list.d/mono-official-stable.list

# 更新包列表并安装 Mono
RUN apt-get update
RUN apt-get install -y mono-devel

RUN dpkg --add-architecture i386
RUN apt-get update 
RUN apt-get install -y wine


# 清理不必要的文件和缓存
RUN apt-get clean && \
    rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*

问题:

  1. npm安装卡住
    在容器运行npm install 命令之后会在安装某个包时卡住不动
  2. npm运行打包命令失败
    运行打包命令时会出现错误
    02934fa93fd3703309a576f5797b1c18.png

解决方法:在安装依赖时使用 npm@6,在打包时切换成npm@8即可(打包在npm@6不行可能是当前的node-api不适配)

npm install npm@6 -g
npm install
npm install npm@8 -g
npm run build-script

另外需要注意在打包之前需要用在windows平台准备好的包替换掉原生模块包。

参考

https://zhuanlan.zhihu.com/p/330468774
https://github.com/nodejs/help/issues/3761
https://nodejs.org/api/addons.html


chshihang
116 声望13 粉丝