首页 > 系统相关 >electron-forge通过Squirrel.Windows打包导致的asar文件过大的解决方案

electron-forge通过Squirrel.Windows打包导致的asar文件过大的解决方案

时间:2024-08-17 12:15:40浏览次数:14  
标签:文件 Squirrel Windows process electron forge 打包 asar

环境

我的Eectron环境如下:

"@electron-forge/cli": "^7.1.0",
"@electron-forge/maker-deb": "^7.1.0",
"@electron-forge/maker-rpm": "^7.1.0",
"@electron-forge/maker-squirrel": "^7.1.0",
"@electron-forge/maker-zip": "^7.1.0",
"@electron-forge/plugin-auto-unpack-natives": "^7.1.0",
"@electron-forge/plugin-vite": "^7.1.0",
"@electron/packager": "^18.3.3",
"@electron/rebuild": "^3.3.0",
"@vitejs/plugin-vue": "3.1.0",
"electron": "^27.1.0",

问题如下

  1. 如果你打包后的asar文件包含了项目的整个源代码?方法如下
    你可以使用asar extract app.asar <输入目录>命令提取出asar文件包含的内容,从而分析asar是否包含了不需要包含的文件。
    如果包含了项目不需要打包进asar的文件,我们需要设置forge.config.js文件的内容,需要配置ignore属性的内容信息,关于ignore属性的使用说明在这里可以看到: https://electron.github.io/packager/main/interfaces/Options.html#ignore
    我的forge.config.js如下配置内容,仅供参考:
module.exports = {
  packagerConfig: {
    asar: true,
    ignore:['/.idea', /^\/logs$/, /^\/deps$/, /^\/extensions$/, /^\/src$/ ,/^\/.device-config$/, /^\/.gitignore$/, /^\/package-lock.json$/, /^[/\\]vite\.\w+\.config\.js$/],
    ...其他配置
  },
  ...其他配置
}

上边的ignore解析方式是如果当前目录被忽略了,当前目录的子内容就也会被忽略到。
起始路径是以forge.config.js文件所在的目录开始,要忽略的文件和目录以相对的目录进行定义就行。

  1. 设置不需要打包进asar的文件和目录的方式?方法如下
    这里我们就需要使用packagerConfig.extraResource属性了,这个属性会将配置的目录或文件路径,不打包进asar文件中,但是将其放在/resources目录下。/resources目录是在你打包构建成exe后可见,
    但是在未构建的情况下,也能获取到/resources目录的位置,这个位置就会是node_modules/electron目录下的/resources目录。
    我们可以通过process.resourcesPath属性来获取。
    这边建议的方式是使用process.cwd()来自行构建生产和开发时的环境配置,以防指定的资源路径不一样导致的访问不到的问题。
    这是我的pathutils的代码,仅供参考:
export function getAppPath() {
    if(process.env.NODE_ENV === "development"){
        const targetPath = path.join(process.cwd(), 'out', 'app');
        if(!fs.existsSync(targetPath)){
            fs.mkdirSync(targetPath, { recursive: true })
        }
        return path.join(process.cwd(), 'out', 'temp-root')
    }else if(process.env.NODE_ENV === "production"){
        return process.cwd();
    }else{
        console.error("未知的Node环境", process.env.NODE_ENV)
        return null;
    }
}


export function getAppResourcePath(devPaths, prodPaths){
    return path.join(getAppPath(),
        process.env.NODE_ENV === "development" ? devPaths : "",
        process.env.NODE_ENV === "production" ? prodPaths : "",
    )
}
  1. process.env.NODE_ENV在构建打包成exe文件后,通过exe运行时获取到的process.env.NODE_ENV环境变量的值是undefined问题
    这里我们需要借助app.isPackaged属性进行自己赋值环境变量的值。
    我们可以在main.js的执行内容的最上方添加以下代码即可。
if (app.isPackaged) {
    process.env.NODE_ENV = 'production'
}

属性的说明:
app.isPackaged 只读 返回一个boolean值,如果应用已经打包,返回true ,否则返回false 。 对于大多数应用程序,此属性可用于区分开发和生产环境。

electron packager打包后process.env.NODE_ENV为undefined,可在这篇issue获取到有关信息

  1. 这里说明下electron-packager,关于ignore和asar文件的配置参数的使用说明
    ignore可以理解为是否要包含进asar文件的属性,如果这个属性指定的内容匹配上了,
    那么将不会出现在asar的文件中。
    asar.unpackasar.unpackDir是对于将要打包进asar中的文件内容,进行不同的行为操作,一个是针对文件的,一个是针对目录的。
    asar.unpack:所有与提供的 glob 表达式相匹配的文件都会被解压到 app.asar.unpacked 目录下,并且这些文件不会被打包进 ASAR 文件中。
    asar.unpackdir: 与该属性值匹配的所有目录及其内容都将被解压到 app.asar.unpacked 目录下。这意味着这些目录不会被包含在 ASAR 文件内。

动态生成的文件或者需要频繁写入的日志文件通常会使用 unpack 或 unpackDir 来确保它们不被包含在 ASAR 存档中。

有关asar支持的命令行命令

其他参考资料

Electron 应用程序打包体积过大常用的优化方法
electron ASAR Archives
github package volume size to large
The packaged file volume is too large and contains nodes_ modules electron-forge package (--template=vite)
Undocumented breaking change for Vite plugin in v7.3.0

vite plugin v7.3.0版本以上的版本,进行了一次大的变更,配置xxx.main.config.js等文件的方式进行了改变。
electron-forge对于vite-plugins的使用说明在当前时间并未进行更新。

feat: adds default fuses to templates

关于模板的初始默认配置的commit说明

vite template can not generate asar
packagerConfig in ForgeConfig ignores afterComplete hook functions

关于在packagerConfig中的配置afterComplete后,遇到构建进程挂起的问题。是因为执行完成后,别忘调用callback回调方法。

我当时以为是错误的回调方法,原来是执行完成的执行方法,不执行callback就会一直挂起构建的进程。

最后一个是关于我当时提交的issue,有关asar打包文件大的问题

标签:文件,Squirrel,Windows,process,electron,forge,打包,asar
From: https://www.cnblogs.com/XingXiaoMeng/p/18364165

相关文章

  • Ubuntu安装mysql 以及远程连接mysql Windows—适合初学者的讲解(详细)
    目录准备工作一.Xshell中操作(1)在虚拟机中安装mysql(2)连接Windows数据库(3)进入linux数据库。(4)修改mysql配置文件二.Windows命令窗口操作 需要软件虚拟机,Xshell。准备工作1.首先需要打开虚拟机,然后在终端上安装ssh,远程传输协议。安装指令为:sudo apt install......
  • 折腾WindowsTerminal
    工位电脑重装系统,折腾一下WindowsTerminal。内网环境安装起来也比较麻烦好像win10不是最新版,直接用AppPackage安装是不能运行的?而且也不能设置成默认终端WindowsTerminalgithub发布页面下载.zip文件解压之后可以使用Powershell下载地址可以在微软官网找到msi安装包开机后启......
  • Windows11恢复经典的右键菜单:一条命令解决显示更多选项问题
      https://zhuanlan.zhihu.com/p/706293496修改注册表。需要以管理员身份运行CMD或者Powershell后,输入如下的命令添加一个注册表信息即可:regadd"HKCU\Software\Classes\CLSID\{86ca1aa0-34aa-4e8b-a509-50c905bae2a2}\InprocServer32"/f/ve运行完之后需要重启系统......
  • [20240815]oracle21c环境变量ORACLE_PATH与SQLPATH(windows).txt
    [20240815]oracle21c环境变量ORACLE_PATH与SQLPATH(windows).txt--//我记忆以前测试过这个问题,当时是家里的笔记本,安装oracle12.2cforwindows.OS:windows7,发现无法访问SQLPATH或者--//ORACLE_PATH环境变量定义的路径下login.sql文件.我当时解决办法就是登录手工执行init.sq......
  • MySQL在Windows和Ubuntu上的安装与远程连接配置指南
    MySQL是一种开源的关系型数据库管理系统,被广泛应用于各种应用程序和网站中。MySQL5.7虽不是MySQL的最新版本,但仍具有许多新功能和改进,提供了更高的性能、安全性和可靠性。本文将详细介绍MySQL5.7,并提供在Ubuntu 22.04上安装、初始化配置和开通远程访问的步骤。在Ubuntu22......
  • windows 内核驱动通过哪些方式直接访问硬件
    Windows内核驱动可以通过以下几种主要方式直接访问硬件:1.内存映射I/O(Memory-MappedI/O,MMIO)  -使用MmMapIoSpace函数将物理地址映射到虚拟地址空间  -直接读写映射后的内存地址来访问硬件寄存器  示例:  ```c  PHYSICAL_ADDRESSphysicalAddre......
  • Linux 做 SSH 免密连接 Windows 踩坑记录
    做LinuxSSH免密连接Windows10时踩到个坑,按照教程做了以下操作:把Linux上生成的id_rsa.pub复制到了Windows10下的C:/Users/<用户名>/authorized_keys;修改C:\ProgramData\ssh\sshd_config,注释以下两行#MatchGroupadministrators#AuthorizedKeysFile__PR......
  • utilman.exe 是 Windows 操作系统中的一个系统工具程序,全称为 Utility Manager。它的
    utilman.exe(实用工具管理器)在Windows系统中主要用于启动辅助功能工具,但它也曾经被发现存在一些安全漏洞。这些漏洞通常利用utilman.exe的特性进行权限提升或绕过安全机制。以下是一些已知的与utilman.exe相关的公开漏洞:1. CVE-2019-0708(BlueKeep)描述:这个漏洞影响了......
  • Ettercap 是一个用于网络嗅探和中间人攻击的开源工具,主要用于网络安全测试和分析。它
    Ettercap是一个用于网络嗅探和中间人攻击的开源工具,主要用于网络安全测试和分析。它支持多种平台,包括Linux、Windows和macOS。Ettercap可以用来监视、分析、和修改网络流量,通常用于测试和审计网络的安全性。以下是Ettercap的一些主要功能和特点:主要功能嗅探和分析网络......
  • MNN框架在windows上的部署
    一、MNN.lib文件等的生成算是第一次接触MNN框架部署这部分内容吧,对整个流程都不是很理解,故先从官方文档入手先从github下载官方的项目,地址为:https://github.com/alibaba/MNN使用visualstudio的powershell打开,执行官网给出的指令cdpath/to/MNNpowershell./schema/generat......