使用docker打包具体可见:Docker打包Electron项目在windows平台中的应用程序(一),本文对镜像做了一些修改并对打包中遇到的问题进行记录。
问题主要有两个方面
- 使用docker打包的应用无法在windows正常运行
- 切换镜像后docker打包问题
使用docker打包的应用无法在windows正常运行
原因
原生Node.js模块由Electron支持,但由于Electron具有与给定Node.js不同的 应用二进制接口 (ABI)(由于使用Chromium的 BoringSL 而不是 OpenSSL 等 差异),您使用的原生模块需要为Electron重新编译。
由于native module文件依赖于平台,所以在各个平台需要编译;
又由于Electron和node的ABI不一样,所以针对electron原生模块需要重新编译。
原生模块解释:
只从使用上看:
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++代码,这些东西要跨平台,就需要使用源码根据实际的操作平台环境进行原生模块编译
解决方法
使用@electron/rebuild对原生模块重新编译
./node_modules/.bin/electron-rebuild -f -w native_module
- 直接下载适用于Electron的原生模块
- 手动编译
因为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/*
问题:
- npm安装卡住
在容器运行npm install
命令之后会在安装某个包时卡住不动 - npm运行打包命令失败
运行打包命令时会出现错误
解决方法:在安装依赖时使用 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
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。