Electron 项目实战 02:打包和自动更新

news2024/11/16 7:31:57

技术选型

  • electron-forge
  • electron-builder

electron-forge 是Electron 官方文档介绍的,打包和发布都包含了,但是包含的坑也非常多。electron-builder下载量和集成打包非常顺利,本教程也是采用electron-buid来介绍打包。大家在技术选型的时候要多找几个,原则:选下载量高、社区活跃度高、问题少的技术,这样可以让你少走很多弯路。

由于我没有mac os 环境,就只介绍windows 环境打包和更新,按文档添加对应配置应该问题不大。

安装依赖

yarn add electron-builder -D

添加打包配置

  • package.json

    {
      "name": "my-electron-app",
      "version": "0.0.1",
      "main": "main.js",
      "author": "Potter<aa4790139@gmail.com>",
      "license": "MIT",
      "scripts": {
        "dev": "electron .",
        "publish": "electron-builder --win -p always"
      },
      "build": {
        "appId": "com.my.electron.app",
        "productName": "my-electron-app",
        "publish": [
          {
            "provider": "github",
            "owner": "yxw007",
            "repo": "electron_app"
          }
        ],
        "win": {
          "target": "nsis"
        },
        "directories": {
          "output": "build"
        },
        "nsis": {
          "oneClick": false,
          "allowToChangeInstallationDirectory": true
        }
      },
      "devDependencies": {
        "electron": "^28.0.0",
        "electron-builder": "^24.9.1"
      },
    }
    

打包

npm run publish

Untitled.png

打包后会自动发布至github对应仓库,Release页会自动生成一个Draft,需要手动发布才能成为正式版本

Untitled 1.png

集成自动更新

  • 安装依赖

    yarn add electron-updater electron-log
    
  • index.html,添加一个更新标签来显示我们的更新信息

    <!DOCTYPE html>
    <html>
    
    <head>
    	<meta charset="UTF-8" />
    	<!-- https://developer.mozilla.org/en-US/docs/Web/HTTP/CSP -->
    	<meta http-equiv="Content-Security-Policy"
    				content="default-src 'self'; script-src 'self'" />
    	<meta http-equiv="X-Content-Security-Policy"
    				content="default-src 'self'; script-src 'self'" />
    	<title>Electron App</title>
    </head>
    
    <body>
    	<div>Electron App</div>
    	Current version: <span id="version">vX.Y.Z</span>
    	<p id="info"></p>
    	<div id="message"></div>
    </body>
    <script src="./renderer.js"></script>
    
    </html>
    
  • main.js 添加自动相关代码

    const { app, BrowserWindow, ipcMain } = require("electron");
    const path = require("node:path");
    //1.添加日志显示,方便问题排查
    const log = require("electron-log");
    const { autoUpdater } = require("electron-updater");
    
    autoUpdater.logger = log;
    autoUpdater.logger.transports.file.level = "info";
    log.info("App starting...");
    
    let win;
    const createWindow = () => {
    	win = new BrowserWindow({
    		width: 800,
    		height: 600,
    		webPreferences: {
    			preload: path.join(__dirname, "preload.js"),
    		},
    	});
    
    	// win.loadFile("index.html");
    	win.loadURL(`file://${__dirname}/index.html#v${app.getVersion()}`);
    };
    
    function sendStatusToWindow(text) {
    	log.info(text);
    	win.webContents.send("message", { message: text });
    }
    //! autoUpdater 监听相关的常用事件
    autoUpdater.on("checking-for-update", () => {
    	sendStatusToWindow("Checking for update...");
    });
    autoUpdater.on("update-available", (info) => {
    	sendStatusToWindow("Update available.");
    });
    autoUpdater.on("update-not-available", (info) => {
    	sendStatusToWindow("Update not available.");
    });
    autoUpdater.on("error", (err) => {
    	sendStatusToWindow("Error in auto-updater. " + err);
    });
    autoUpdater.on("download-progress", (progressObj) => {
    	let log_message = "Download speed: " + progressObj.bytesPerSecond;
    	log_message = log_message + " - Downloaded " + progressObj.percent + "%";
    	log_message =
    		log_message +
    		" (" +
    		progressObj.transferred +
    		"/" +
    		progressObj.total +
    		")";
    	sendStatusToWindow(log_message);
    });
    autoUpdater.on("update-downloaded", (info) => {
    	sendStatusToWindow("Update downloaded");
    	//! 下载完后立即更新
    	autoUpdater.quitAndInstall();
    });
    
    app.whenReady().then(() => {
    	//! 主进程,处理渲染进程的消息
    	ipcMain.handle("ping", () => {
    		return `I'm ipcMain`;
    	});
    
    	// ! 1.监听来自渲染进程的消息
    	ipcMain.on("message-from-renderer", (event, arg) => {
    		console.log("Renderer Process Message:", arg);
    
    		//! 2.发送回复消息到渲染进程
    		event.sender.send("message-from-main", "Hello from main process!");
    	});
    
    	createWindow();
    	console.log(process.platform);
    	app.on("activate", () => {
    		if (BrowserWindow.getAllWindows().length === 0) {
    			createWindow();
    		}
    	});
    });
    
    app.whenReady().then(() => {
      //! app ready 自动检查更新
    	autoUpdater.checkForUpdatesAndNotify();
    	console.log("app ready: checkForUpdatesAndNotify");
    });
    
    app.on("window-all-closed", () => {
    	if (process.platform !== "darwin") {
    		console.log("quit");
    		app.quit();
    	}
    });
    

重新发布版本

npm run publish

此时github 对应仓库Release 页面又会多一个Draft版本,点击修改让其发布,然后更新package.json 中的版本号,再重新发布一次。

为了让你看到这个过程,你可以先下载我演示的my-electron-app-Setup-0.1.4.exe,安装完后打开会检测自动更新,安装完后再打开就会看到更新至v0.1.5

Untitled 2.png

Untitled 3.png

总结

  • 技术选型时尽量多选几个,选择下载量高、社区活跃高(发包更新频率、bug修复数量、bug修复速度综合对比下)的技术,可以让你少踩坑

补充

说明:如果更新出错,可以到C:\Users\Administrator\AppData\Roaming\xxx\logs 目录下查看main.log 日志查看具体问题

完整:demo

参考文献

  • https://github.com/yxw007/electron-updater-example
  • https://www.electron.build/

更多

家人们,我最近花了2个多月开源了一个文章发布助手artipub,可以帮你一键将markdown发布至多平台(发布和更新),方便大家更好的传播知识和分享你的经验。
目前已支持平台:个人博客、Medium、Dev.to(未来会支持更多平台)
官网地址:https://artipub.github.io/artipub/
仓库地址:https://github.com/artipub/artipub

目前库已可以正常使用,欢迎大家体验、如果你有任何问题和建议都可以提Issue给我反馈。
如果你感兴趣,特别欢迎你的加入,让我们一起完善好这个工具。
帮忙点个star⭐,让更多人知道这个工具,感谢大家🙏

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2090891.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

火绒补充| 截止目前修改时间| 本文已上全站总榜33

目录 为什补充&#xff1f; 用户界面优化&#xff1a; 性能提升&#xff1a; 启发式检测和行为分析&#xff1a; 恶意网址拦截&#xff1a; 系统修复功能&#xff1a; 网络安全防护&#xff1a; 云查杀引擎&#xff1a; 漏洞修复和补丁管理&#xff1a; 隐私保护&…

算法的学习笔记—把数组排成最小的数(牛客JZ45)

&#x1f600;前言 在编程面试中&#xff0c;经常会遇到需要将问题转化为排序问题的题目。这些问题看似复杂&#xff0c;但只要抓住核心思路&#xff0c;便能迅速解决。今天我们就来看一道这样的题目&#xff1a;如何将一个非负整数数组拼接成最小的数字。 &#x1f3e0;个人主…

Cracking the Safe

原题链接&#xff1a;https://leetcode.cn/problems/cracking-the-safe/description/ 题目要求的是&#xff0c;某个时刻能够打开保险箱的任一最短密码序列&#xff0c;需要包含所有密码子串。 答案应当是一个字符串&#xff0c;任意长度为n的子串的都是一种密码方案。 对于有n…

探索前沿科技:在本地系统上安装和使用Style TTS2进行高质量语音合成

我们正处于一个令人激动的时代&#xff0c;有如此多的选择&#xff0c;不仅在大型语言模型方面&#xff0c;还有现在的文本到语音&#xff08;TTS&#xff09;模型。在这篇文章中&#xff0c;我将向您展示如何在本地系统上轻松安装这个非常出色的模型——Style TTS2&#xff0c…

联蔚盘云亮相CDIE消费品行业峰会

8月28日&#xff0c;由华昂集团主办&#xff0c;专注于消费品行业的2024CDIE行业峰会在广州盛大开幕。联蔚数科携子品牌联蔚盘云亮相本次大会。本次峰会汇聚了众多企业高管&#xff0c;行业领域专家&#xff0c;围绕AI技术前沿、数智营销新策略、会员运营以及品牌增量路径等话题…

2024如何开始进入美业?美业创业步骤分享|博弈美业系统管理系统源码

进入美业可以是一个令人兴奋且具有挑战性的决定。以下是一些步骤&#xff0c;希望可以帮助你在美业建立自己的职业生涯&#xff1a; 1.确定你的兴趣和专长&#xff1a; 首先要考虑你对美业的兴趣和擅长的领域&#xff0c;比如化妆、美发、美甲、美容护理等。确定自己的兴趣和优…

随笔八、LED-RGB灯程控测试

目录 1. 泰山派环境 2. 编程控制 1. 泰山派环境 泰山派开发板上有一颗RGB三色LED灯&#xff0c;烧写官方镜像上电后开始闪烁&#xff0c;表示系统已经正常运行。可以在设备树里修改初始状态。 查看电路图知道&#xff0c;RGB是通过GPIO1的B0~B2引脚控制的&#xff0c;低电平…

【吊打面试官系列-Redis面试题】Memcache 与 Redis 的区别都有哪些?

大家好&#xff0c;我是锋哥。今天分享关于 【Memcache 与 Redis 的区别都有哪些&#xff1f;】面试题&#xff0c;希望对大家有帮助&#xff1b; Memcache 与 Redis 的区别都有哪些&#xff1f; 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 1、存储方式 Memecach…

Java笔试面试题AI答之面向对象(9)

文章目录 49. 简述Java继承时&#xff0c;类的执行顺序是什么&#xff1f;一、类的静态成员初始化顺序二、对象的初始化顺序三、总结 50. 举例说明什么情况下会更倾向于使用抽象类而不是接口&#xff1f;1. 当需要定义和实现部分通用行为时2. 当需要访问修饰符或方法修饰符时3.…

07.整合Pinia

1. 前言 Pinia 是 Vue 的专属状态管理库&#xff0c;它允许你跨组件或页面共享状态。更加契合 VUE3 组合式 API 和 TS 类型支持。想进一步了解&#xff0c;参考官网&#xff1a;https://pinia.vuejs.org/ 如果是使用官方脚手架搭建的工程&#xff0c;选择了 pinia 将会自动帮我…

Git之2.5版本重要特性及用法实例(五十七)

简介&#xff1a; CSDN博客专家、《Android系统多媒体进阶实战》一书作者. 新书发布&#xff1a;《Android系统多媒体进阶实战》&#x1f680; 优质专栏&#xff1a; Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a; 多媒体系统工程师系列…

Qt应用的高分辨率适配

背景 工作中需要面对触控大屏的4K分辨率场景&#xff0c;同时也有越来越多人开始使用高分屏&#xff0c;原来多基于1080p分辨率开发的Qt程序无法很好适配更高的分辨率。 没有特意针对高分辨率场景做适配时&#xff0c;Qt应用的表现通常有两种情况&#xff1a; 分辨率高的情况…

六西格玛管理培训公司 谈 故障树分析(Fault Tree Analysis)

故障树分析&#xff08;Fault Tree Analysis, FTA&#xff09;&#xff1a;一种自顶向下的演绎故障分析工具&#xff0c;其中使用布尔逻辑将一系列较低级别的事件组合起来&#xff0c;用以分析系统的非期望状态。那么&#xff0c;如何使用故障树分析&#xff08;FTA&#xff09…

集成电路学习:什么是CRC循环冗余校验

一、CRC&#xff1a;循环冗余校验 CRC&#xff08;Cyclic Redundancy Check&#xff09;&#xff0c;即循环冗余校验&#xff0c;是一种根据网络数据包或计算机文件等数据产生简短固定位数校验码的快速算法。它主要用于检测或校验数据传输或保存后可能出现的错误。CRC利用除法及…

[Labview] 表格改值后单元格编辑功能,更改颜色、字体、颜色等

效果如下所示&#xff1a; 例子中演示了单元格变色&#xff0c;具体需要什么修改&#xff0c;在相同的位置进行操作即可。 检测到[鼠标释放]事件&#xff0c;则记录被选中的单元格。 使用[鼠标按下]事件也可以&#xff0c;不过我个人测试下来&#xff0c;[按下]的判断精准度不…

智能候诊系统 项目源码25287

摘 要 科技进步的飞速发展引起人们日常生活的巨大变化&#xff0c;电子信息技术的飞速发展使得电子信息技术的各个领域的应用水平得到普及和应用。信息时代的到来已成为不可阻挡的时尚潮流&#xff0c;人类发展的历史正进入一个新时代。在现实运用中&#xff0c;应用软件的工作…

万亿低空经济:无人机飞手考证正当时

随着低空经济的不断发展和国家政策的持续推动&#xff0c;无人机行业正迎来前所未有的发展机遇。低空经济作为一种新兴的综合性经济形态&#xff0c;依托低空空域&#xff0c;通过各类有人驾驶和无人驾驶航空器的低空飞行活动&#xff0c;辐射带动相关领域融合发展。这一领域涉…

视频结构化从入门到精通——GPU主要硬件平台介绍

视频结构化主要硬件平台 1. 深度学习中“硬”和“软”的概念 在深度学习中&#xff0c;“硬”和“软”通常用于描述不同的处理方法或策略&#xff0c;尤其是在解码、编码、推理等任务中。它们反映了算法在处理信息时的确定性和灵活性。 软&#xff08;Soft&#xff09; 处理…

电子检测报告如何盖骑缝章?

电子检测报告如何盖骑缝章&#xff1f;使用e章宝&#xff08;易友EU3000智能盖章软件&#xff09;给电子检测报告盖骑缝章&#xff0c;可以遵循以下步骤进行&#xff1a; 一、准备工作 确保e章宝软件已安装&#xff1a; 在计算机上安装e章宝&#xff08;易友EU3000智能盖章软件…

小程序页面跳转传url参数被截取问题

跳转时处理 const params {url:hhtp://www.baidu.com?a1}const queryString Object.keys(params).map(key > ${encodeURIComponent(key)}${encodeURIComponent(params[key])}).join(&);wx.navigateTo({url: ../../toPageView/toPageView?${queryString},})webview页…