You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
我一开始是在 packagerConfig 里声明了 all: true,但是 electron-forge 报错了,说它不支持这个选项,所以我把 make 命令拆分成了以下三个:
make:darwin:打包出适用于 macOS 的 x64 和 amr64 的 dmg 包
make:win:打包出适用于 Windows 的 ia32 和 x64 的包
make:linux:打包出适用于 Linux 的 deb 和 rpm 包
先说 make:darwin
make:darwin 我一开始是这么写的:electron-forge make --arch=arm64,x64 --platform=darwin。
首次运行时,electron-forge 会从网络上下载一些二进制包,而为了成功下载,你可能需要确保通过代理去下载——比如开启代理软件的 TUN Mode。
但它报错了:
> electron-forge make --arch=arm64,x64 --platform=darwin
✔ Checking your system
✔ Loading configuration
✔ Resolving make targets
› Making for the following targets:
✔ Running package command
✔ Preparing to package application
✔ Running packaging hooks
✔ Running generateAssets hook
✔ Running prePackage hook
✔ Packaging application
✔ Packaging for arm64 on darwin [1s]
✔ Packaging for x64 on darwin [1s]
✔ Running postPackage hook
✔ Running preMake hook
❯ Making distributables
✖ Making a dmg distributable for darwin/arm64
› Target already exists
✖ Making a dmg distributable for darwin/x64
◼ Running postMake hook
An unhandled rejection has occurred inside Forge:
Error: Target already exists
at /Users/xxx/WebstormProjects/myApp/node_modules/appdmg/lib/appdmg.js:80:53
at node:fs:2290:7
at FSReqCallback.oncomplete (node:fs:200:23)
我错了,electron-builder 更简单好用 😂
以下是原文:
先贴环境:
最近开发了一个小 Electron 应用,算是用来练习。由于业务逻辑不复杂,所以开发阶段很顺利,没有遇到什么问题,但是在打包阶段就踩到很多坑了,记录一下。
以前主流的打包工具是 electron-builder,但后来 Electron 官方重写了 electron-forge,所以我还是决定使用官方支持的。
第一个坑:Electron Forge 不支持 monorepo 项目结构(又或者 NPM / Yarn workspaces)
项目一开始使用了 monorepo 的形式,即以下结构:
其中程序的代码是写在
apps/myElectronApp
下的。开发阶段没有遇到问题,但是在使用electron-forge package
生成了一个 myElectronApp.app 文件后,运行时会报错“找不到模块 lodash”。在经过一番排查后,发现是因为项目使用了 monorepo,所以应用程序的依赖项(即
dependencies
)被安装(或者说被“提升”)到了项目根目录的node_modules
中,而不是apps/myElectronApp/node_modules
中,而 electron-forge 使用的 @electron/packager 只会从当前目录的 node_modules(即apps/myElectronApp/node_modules
)中复制依赖项的代码,而这个文件夹是个空的,所以就没有把 lodash 的代码复制进去。相关 issue:
不确定 electron-builder 是否也有这个问题,没试过。
知道原因之后,这个问题就有了两个解决方案:
为了方便起见,我把项目从 monorepo 改回来成传统的项目了。
第二个坑:
packagerConfig.ignore
在使用 electron-forge package 打包之后,可以在
out/myElectronApp-darwin-arm64/myElectronApp.app/Contents/Resources/app
目录下看看有哪些文件被打包进去了,此时会发现有很多不必要的文件(比如 tsconfig.json 和用于存放 ts 文件的 src 目录),可以用ignore
选项排除掉。这个选项可以填写字符串或者正则表达式,但是填字符串的时候有个坑,比如我填了
src
之后,就发现它不仅排除掉了我自己的 src 目录,还把 node_modules 里的 src 目录(例如 node_modules/debug/src)也排除掉了,然后就会导致运行时报找不到文件的错误。目前还不确定要怎么定位到自己项目的目录,文档上也没有写,需要一点点尝试。
另外,package.json 是不能排除的。
第三个坑:在 M1 电脑上同时生成 arm64 和 x64 的 .dmg 包及生成 Windows 系统的包
先说总结:跨平台打包有很多坑,还是老老实实的在单一平台打包。
参考链接:
我一开始是在 packagerConfig 里声明了
all: true
,但是 electron-forge 报错了,说它不支持这个选项,所以我把 make 命令拆分成了以下三个:make:darwin
:打包出适用于 macOS 的 x64 和 amr64 的 dmg 包make:win
:打包出适用于 Windows 的 ia32 和 x64 的包make:linux
:打包出适用于 Linux 的 deb 和 rpm 包先说
make:darwin
make:darwin
我一开始是这么写的:electron-forge make --arch=arm64,x64 --platform=darwin
。但它报错了:
而且
out/make
文件夹下只有一个myElectronApp.dmg
,但是我预期是有两个 dmg 的。然后经过多次尝试,改成了:
electron-forge make --arch=arm64 --platform=darwin && electron-forge make --arch=x64 --platform=darwin
这次就正常了,
out/make
文件夹下有两个 dmg 文件,分别为myElectronApp-1.0.0-arm64.dmg
和myElectronApp-1.0.0-x64.dmg
。再说
make:win
make:win
是这么写的:electron-forge make --arch=ia32,x64 --platform=win32
第一次运行时会报错,说需要
brew install --cask wine-stable
。安装好了之后再次运行,会报错
无法打开 Wine Stabel,因为无法验证其开发者
。这个时候需要进入系统设置 - 隐私与安全性 - 在【已阻止使用 Wine Stable,因为其来自身份不明的开发者。】下面点击【仍要打开】。
然后再次运行,这次会弹出几个 Wine Stable 的权限申请弹窗,都点击【允许】。
然后这次又报错了:
Error: You must install both Mono and Wine on non-Windows
然后根据 https://www.mono-project.com/docs/getting-started/install/mac/ 的说明安装 Mono。
运行 Mono 的安装包时又会跳出【无法打开 xxx,因为无法验证其开发者】的弹窗,用同样的方法【仍要打开】即可。
安装完成后再次运行,还是报错了
Error: You must install both Mono and Wine on non-Windows
……我以为是同时声明了两个 arch 的问题,但改成一个之后还是报这个错。
不折腾了,感觉跨平台打包很多坑,还是老老实实在 GitHub Actions 里用 macOS / Windows / Ubuntu 系统分别打包吧。
使用体验
虽然有一些坑,但我觉得 Electron Forge 学习起来非常简单直观,只需几个简单的步骤就能成功打包应用。相比而言,在阅读 Electorn Builder 的文档的时候,看到一堆 Configuration 让我觉得很复杂,有点无从下手的感觉。
但另一方面,又不得不说 electron builder 要完善很多,比如打包的格式丰富多样、无需部署专门的更新服务器(只需一个静态文件服务器)就可以自动更新、双 package.json 结构等。
我决定下次试试 electron builder。
The text was updated successfully, but these errors were encountered: