• Electron自动更新


    注:本文使用的是 electron-builder 配合 electron-updataer 实现自动更新效果。该方案仅在 Windows环境中适用,Mac环境比本文多一步安装证书,需要自行解决,Linux环境请直接跳过本文。


    更新流程

    • 使用 electron-builder 构建生成 latest.yml (mac软件是latest-mac.yml)以及安装包等文件;
    • 将 latest.yml 以及生成的安装包放在一个静态资源服务器上,指向这些文件的根路径;
    • 项目启动后 electron-updataer 检查更新,若有新版本自动更新;

    electron-builder 构建程序

    1、安装 electron-builder

    npm install electron-builder --save-dev

    npm install module-name --save 自动把模块和版本号添加到dependencies部分
    npm install module-name --save-dev 自动把模块和版本号添加到devDependencies部分

    2、配置package.json

    package.json文件中的 version 值,控制着打出来包的版本。

     在package.json文件中把下面的打包配置写在和 scripts 配置同级的地方。

    1. "build": {
    2. "productName":"xxxx", //项目名 这也是生成的exe、dmg文件的前缀名
    3. "appId": "com.xxx.xxxxx", //包名 打包mac时写成自己应用的appId,打包Windows随意添写
    4. "copyright":"xxxx", //版权信息 安装好后出品公司显示的就是该内容
    5. "directories": { //打包输出位置的文件夹
    6. "output": "./out"
    7. },
    8. "nsis": { //nsis相关配置,打包方式为nsis时生效
    9. "oneClick": false, //是否一键安装
    10. "allowElevation": true, //允许请求提升,如果为false,则用户必须使用提升的权限重新启动安装程序。
    11. "allowToChangeInstallationDirectory": true, //允许修改安装目录
    12. "installerIcon": "./aa.ico", //安装图标
    13. "uninstallerIcon": "./aa.ico", //卸载图标
    14. "installerHeaderIcon": "./aa.ico", //安装时头部图标
    15. "createDesktopShortcut": true, //创建桌面图标
    16. "createStartMenuShortcut": true, //创建开始菜单图标
    17. "shortcutName": "xxxx", //图标名称
    18. },
    19. "publish": [
    20. {
    21. "provider": "generic", //服务器提供商,也可以是GitHub、自己服务器等,全部都在这个值就行
    22. "url": "http://xxxxx/" //服务器地址 里面可以访问到 latest.yml 以及生成的安装包
    23. }
    24. ],
    25. "files": [ //打包后需要使用的h5相关文件
    26. "./css",
    27. "./html",
    28. "./js",
    29. "./index.html"
    30. ],
    31. "dmg": { //macOSdmg 打包mac软件使用的,这个可以不动
    32. "contents": [
    33. {
    34. "x": 410,
    35. "y": 150,
    36. "type": "link",
    37. "path": "/Applications"
    38. },
    39. {
    40. "x": 130,
    41. "y": 150,
    42. "type": "file"
    43. }
    44. ]
    45. },
    46. "win": {
    47. "icon": "./aims.ico", //软件图标
    48. "target": [
    49. {
    50. "target": "nsis", //使用nsis打成安装包,"portable"打包成免安装版,默认使用niss,win平台一般也是用这个
    51. "arch": [ //打包出来的安装包是64位还是32位,推荐使用32位,这样的包比较小
    52. "ia32" //32位
    53. ]
    54. }
    55. ]
    56. },
    57. "mac": { //软件图标
    58. "icon": "./icon.icns"
    59. },
    60. "linux": {
    61. "icon": "./icons"
    62. }
    63. }

    3、打包生成软件

     在package.json文件scripts 配置中加上下面两行

    1. "scripts": {
    2. "start": "electron-forge start",
    3. "buildwin": "electron-builder --win", //这行
    4. "buildmac": "electron-builder --mac" //这行
    5. },

    打包生成windos安装包

    npm run buildwin
    

     打包生成mac安装包(mac这一步需要配置证书,我没搞mac的软件,这步请自行解决

    npm run buildmac
    

    electron-updater 更新程序

    1、将更新文件放到服务器

    将 latest.yml (mac软件是latest-mac.yml)以及安装包放到一个可以访问的地方,可以是GitHub、自己服务器等,只要你上面打包的路径能访问到就行。

    2、安装 electron-updater

    npm install electron-updater --save

    3、安装 electron-log

    安装这个依赖包是为了看更新进度

    npm install electron-log --save

    注意:项目运行中的用到依赖包,除了 electron 包,其他的都要在package.json文件 dependencies 配置中写上包名和依赖名称,我们用到了 electron-updater 、electron-log 所以写法如下图:

    4、在main.js中写软件更新代码

    1. const {app, Menu, BrowserWindow, dialog} = require('electron');
    2. const {autoUpdater} = require('electron-updater');
    3. const path = require('path');
    4. const logger = require("electron-log");
    5. //打印log到本地
    6. logger.transports.file.maxSize = 1002430; // 10M
    7. logger.transports.file.format = "[{y}-{m}-{d} {h}:{i}:{s}.{ms}] [{level}]{scope} {text}";
    8. logger.transports.file.resolvePath = () => "./operation.log"; //打印在你安装的软件位置,
    9. //每次启动自动更新检查 更新版本 --可以根据自己方式更新,定时或者什么
    10. autoUpdater.checkForUpdates();
    11. autoUpdater.autoDownload = false;//这个必须写成false,写成true时,我这会报没权限更新,也没清楚什么原因
    12. autoUpdater.on('error', (error) => {
    13. logger.error(["检查更新失败", error])
    14. })
    15. //当有可用更新的时候触发。 更新将自动下载。
    16. autoUpdater.on('update-available', (info) => {
    17. logger.info('检查到有更新,开始下载新版本')
    18. autoUpdater.downloadUpdate()
    19. })
    20. //当没有可用更新的时候触发。
    21. autoUpdater.on('update-not-available', () => {
    22. logger.info('没有可用更新')
    23. })
    24. //在更新下载完成的时候触发。
    25. autoUpdater.on('update-downloaded', (res) => {
    26. logger.info('下载完毕!提示安装更新')
    27. //dialog 想要使用,必须在BrowserWindow创建之后
    28. dialog.showMessageBox({
    29. title: '升级提示!',
    30. message: '已为您下载最新应用,点击确定马上替换为最新版本!'
    31. }).then((index) => {
    32. logger.info('退出应用,安装开始!')
    33. //重启应用并在下载后安装更新。 它只应在发出 update-downloaded 后方可被调用。
    34. autoUpdater.quitAndInstall()
    35. });
    36. })
  • 相关阅读:
    pandasGUI:一款开源的功能异常强大的数据可视化分析工具
    CentOS 7安装zookeeper
    [附源码]SSM计算机毕业设计志愿者管理系统论文2022JAVA
    Android Jetpack的组件介绍,常见组件解析
    MySQL学习笔记18
    部署ZFile在线网盘
    IllegalStateException: FragmentManager is already executing transactions
    OpenGL运行环境的搭建(GLFW+GLAD+OpenGL以及在Vistual Studio中的 配置)
    什么是 ping (ICMP) 洪水 DDOS 攻击?
    倍福PLC通过CANOpen通信控制伺服
  • 原文地址:https://blog.csdn.net/minshiwang/article/details/126887948