2023 electron最新最简版打包、自动升级详解

news2024/12/26 21:45:06

这里我将讲解一下从0搭建一个electron最简版架子,以及如何实现打包自动化更新

之前我有写过两篇文章关于electron框架概述以及 常用api的使用,感兴趣的同学可以看看
Electron桌面应用开发

Electron桌面应用开发2

搭建electron

官方文档:https://www.electronjs.org/zh/

在这里插入图片描述
只需要三个文件就可以跑起来electron

创建一个文件目录

mkdir my-electron-app && cd my-electron-app
yarn init

然后,将 electron 包安装到应用的开发依赖中。

yarn add --dev electron
{
  "name": "my-electron-app",
  "version": "1.0.0",
  "description": "Hello World!",
  "main": "main.js", // 入口文件
  "author": "Jane Doe",
  "license": "MIT",
  "scripts": {
    "start": "electron ."
  },
  "devDependencies": {
    "electron": "^27.0.3",
  }
}

main.js

const createWindow = () => {
  const win = new BrowserWindow({
    width: 800,
    height: 600
  })

  win.loadFile('index.html') // 加载index.html
}

index.html

<!DOCTYPE html>
<html>
  <head>
    <meta charset="UTF-8">
    <!-- https://developer.mozilla.org/zh-CN/docs/Web/HTTP/CSP -->
    <meta http-equiv="Content-Security-Policy" content="default-src 'self'; script-src 'self'">
    <title>你好!</title>
  </head>
  <body>
    <h1>你好!</h1>
    我们正在使用 Node.js <span id="node-version"></span>,
    Chromium <span id="chrome-version"></span>,
    和 Electron <span id="electron-version"></span>.
  </body>
</html>

yarn start就可以启动起来,这是最简版的框架

配置打包、自动升级

这里强调一下

做mac的打包需要开通苹果开发者账号,购买证书,打包需要签名,这里购买和配置的流程很复杂就不做过多赘述,都搜的到。

其实windows也需要签名 证书,但是不提供也可以打包

打包和自动升级用到了官方提供的两个工具

打包:electron-builder
升级:electron-updater

electron-builder官方文档地址:https://www.electron.build/configuration/win#WindowsConfiguration-certificateSubjectName

如果觉得英文看着不方便,有大神中文总结了一下,地址:https://blog.csdn.net/qq_38830593/article/details/89843722

首先下载这两个库:
yarn add electron-builder -D
yarn add electron-updater

package.json里做参数配置

看build参数,各个参数对照着官方文档

{
  "name": "electron-test",
  "version": "1.0.0",
  "description": "Hello World!",
  "main": "main.js",
  "license": "MIT",
  "scripts": {
    "start": "electron .",
    "build": "electron-builder"
  },
  "build": {
    "productName": "electron-test",
    "appId": "cn.legaldawn.Lawdawn",
    "copyright": "版权所有信息",
    "asar": false,
    "directories": {
      "output": "dist"
    },
    "dmg": {
      "artifactName": "${name}-${version}.${ext}"
    },
    "publish": [
      {
        "provider": "generic",
        "url": "https://lawdawn-download.oss-cn-beijing.aliyuncs.com/win-2023-11-04-1/"
      }
    ],
    "mac": {
      "category": "public.app-category.developer-tools",
      "entitlementsInherit": "build/app-entitlements.plist",
      "icon": "build/icon.png"
    },
    "win": {
      "icon": "build/icon.ico",
      "requestedExecutionLevel": "highestAvailable",
      "target": [
        {
          "target": "nsis",
          "arch": [
            "x64"
          ]
        }
      ]
    },
    "linux": {
      "target": [
        {
          "target": "deb",
          "arch": [
            "x64"
          ]
        }
      ],
      "icon": "build/icon.png",
      "maintainer": "主要贡献者",
      "description": "基于4.1.4配置"
    },
    "nsis": {
      "oneClick": false,
      "allowElevation": true,
      "perMachine": false,
      "allowToChangeInstallationDirectory": true,
      "createDesktopShortcut": true,
      "createStartMenuShortcut": true,
      "uninstallDisplayName": "${productName}",
      "shortcutName": "${productName}",
      "artifactName": "${name}-${version}-setup.${ext}",
      "runAfterFinish": true
    }
  },
  "devDependencies": {
    "electron": "^27.0.3",
    "electron-builder": "^24.6.4"
  },
  "dependencies": {
    "electron-log": "^5.0.0",
    "electron-updater": "^6.1.4"
  }
}

main.js

const { app, BrowserWindow, ipcMain } = require('electron')
const { autoUpdater} = require('electron-updater')
const os = require('os')
const logger = require('electron-log')

//打印log到本地
logger.transports.file.maxSize = 1002430 // 10M
logger.transports.file.format =
  '[{y}-{m}-{d} {h}:{i}:{s}.{ms}] [{level}]{scope} {text}'
logger.transports.file.resolvePath = () => './operation.log' //打印在你安装的软件位置,

autoUpdater.autoDownload = false //这个必须写成false,写成true时,我这会报没权限更新,也没清楚什么原因

// 将创建窗口独立成一个函数
function createWindow() {
  let mainWin = new BrowserWindow({
    x: 100,
    y: 100, // 设置窗口显示的位置,相对于当前屏幕的左上角
    show: false, // 默认情况下创建一个窗口对象之后就会显示,设置为false 就不会显示了
    width: 800,
    height: 400,
    // maxHeight: 600,
    // maxWidth: 1000,
    minHeight: 200,
    minWidth: 300, // 可以通过 min max 来设置当前应用窗口的最大和最小尺寸
    resizable: true, // 是否允许缩放应用的窗口大小
    title: 'electron-tester',
    webPreferences: {
      enableWebSQL: false,
      webSecurity: false,
      spellcheck: false,
      nativeWindowOpen: true,
      nodeIntegration: true,
      contextIsolation: false,
    },
    experimentalDarkMode: true,
  })

  mainWin.loadFile('./src/index.html')

  //忽略无关代码
  ipcMain.on('checkUpdate', () => {
    console.log('checkUpdate-->')
    //处理更新操作
    const returnData = {
      error: {
        status: -1,
        msg: '更新时发生意外,无法进行正常更新!',
      },
      checking: {
        status: 0,
        msg: '正在检查更新……',
      },
      updateAva: {
        status: 1,
        msg: '正在升级……',
      },
      updateNotAva: {
        status: 2,
        msg: '当前没有可用的更新...',
      },
    }

    let platform =
      os.platform() === 'darwin'
        ? process.arch === 'x64'
          ? 'darwin'
          : 'darwin-arm64'
        : 'win32'
    let commitId = 'ab4f3c131bfec65670dd265549646b725f8ee649'

    //更新连接
    autoUpdater.setFeedURL(
      // `https://devxz.dafenqi.law/lawdawn-api/api/update/${platform}/${commitId}`
      'https://lawdawn-download.oss-cn-beijing.aliyuncs.com/win-2023-11-04-1'
    )
    logger.error(['检查更新'])
    //更新错误事件
    autoUpdater.on('error', function (error) {
      console.log('err-->', error)
      logger.error(['检查更新失败', error])
      sendUpdateMessage(returnData.error)
    })

    //检查事件
    autoUpdater.on('checking-for-update', function () {
      sendUpdateMessage(returnData.checking)
    })

    //发现新版本
    autoUpdater.on('update-available', function (info) {
      console.log('info22-->', info)
      logger.info(['发现新版本', info])
      sendUpdateMessage(returnData.updateAva)
      autoUpdater.downloadUpdate()
    })

    //当前版本为最新版本
    autoUpdater.on('update-not-available', function (info) {
      console.log('info11-->', info)
      setTimeout(function () {
        sendUpdateMessage(returnData.updateNotAva)
      }, 1000)
    })

    //更新下载进度事件
    autoUpdater.on(
      'download-progress',
      function (progressObj, bytesPerSecond, percent, total, transferred) {
        console.log('progressObj-->', progressObj)
        mainWin.webContents.send('downloadProgress', progressObj)
      }
    )

    //下载完毕
    autoUpdater.on('update-downloaded', function (event, releaseObj) {
      //退出并进行安装(这里可以做成让用户确认后再调用)
      console.log('releaseNotes-->', releaseObj)
      autoUpdater.quitAndInstall()
    })

    //发送消息给窗口
    function sendUpdateMessage(text) {
      mainWin.webContents.send('message', text)
    }

    //发送请求更新
    autoUpdater.checkForUpdates()
  })

  mainWin.on('ready-to-show', () => {
    mainWin.show()
  })
  // mainWin.on('closed', () => {
  //   console.log('mainWin is closed')
  //   mainWin = null
  // })
}

process.env['ELECTRON_DISABLE_SECURITY_WARNINGS'] = 'true'

app.on('ready', createWindow)
app.on('window-all-closed', () => {
  console.log('all window is closed')
  app.quit()
})

index.html

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
  </head>

  <body>
    <h1>Document...</h1>
    <button id="btn">test</button>
    <button id="btn1">检查更新</button>
  </body>
</html>
<script>
  const fs = require('fs')
  const { ipcRenderer } = require('electron')
  document.getElementById('btn').onclick = () => {
    console.log('window-->', window)
    console.log('process-->', process, fs)
    navigator.mediaDevices
      .getUserMedia({ audio: true })
      .then((stream) => {
        console.log('stream-》', stream)
        // Do something with the stream
      })
      .catch((error) => {
        console.error('Failed to access microphone:', error)
      })
  }
  document.getElementById('btn1').onclick = () => {
    //请求检查更新
    ipcRenderer.send('checkUpdate')
  }

  //下载中收到的进度信息
  ipcRenderer.on('downloadProgress', (event, data) => {
    // me.prograssStyle.width = data.percent.toFixed(2) + "%";//更新进度条样式
    // me.stepText = "正在更新中(" + me.prograssStyle.width + ")...";
    console.log('data-->', data)
  })
  //监听请求更新响应,用来处理不同的事件
  ipcRenderer.on('message', (event, data) => {
    switch (data.status) {
      case -1:
        alert(data.msg)
        break
      case 1:
        console.log('正在升级')
        break
      case 2:
        alert(data.msg)
        break
    }
  })
</script>

执行升级

执行yarn build之后,会生成安装包 和 yml文件
在这里插入图片描述
yml文件是内部做检测更新使用

version: 1.0.0
files:
  - url: electron-test-1.0.0-arm64-mac.zip
    sha512: YFebRa4hFb0eq7JBHtIbe6zpEm59b3uR0NaKJJaY5M7G7ZfCoFIWJl/N3cDzSvPK1vWSgeGTRwxteHmwV7PXBQ==
    size: 88974676
  - url: electron-test-1.0.0.dmg
    sha512: ZToMM68na/NWbvYpqqEk3Ej0LzsDoyEYd9rW2qHIaq5FxU/HHNntzX2KiSv002WcLX6aQgLSgh37gvUJytvOpQ==
    size: 92423278
path: electron-test-1.0.0-arm64-mac.zip
sha512: YFebRa4hFb0eq7JBHtIbe6zpEm59b3uR0NaKJJaY5M7G7ZfCoFIWJl/N3cDzSvPK1vWSgeGTRwxteHmwV7PXBQ==
releaseDate: '2023-11-05T08:56:32.685Z'

我们需要把这三个文件放在 对象存储服务器上
在这里插入图片描述
只要提供的更新地址拼接上 latest-mac.yml文件的 可以访问到就可以
在这里插入图片描述
这样就可以做更新了

如果做测试,本地启动一个服务

 //更新连接
    autoUpdater.setFeedURL(
      'http://127.0.0.1:5500/build'
    )

这里指向本地就可以,打包生层的文件放在build目录下 一样测试
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

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

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

相关文章

基于变色龙算法的无人机航迹规划-附代码

基于变色龙算法的无人机航迹规划 文章目录 基于变色龙算法的无人机航迹规划1.变色龙搜索算法2.无人机飞行环境建模3.无人机航迹规划建模4.实验结果4.1地图创建4.2 航迹规划 5.参考文献6.Matlab代码 摘要&#xff1a;本文主要介绍利用变色龙算法来优化无人机航迹规划。 1.变色龙…

5 ip的分配

如上一节所述&#xff0c;需要和其他设备通信&#xff0c;那么需要先配置ip. 1、如何配置ip 1.可以使用 ifconfig&#xff0c;也可以使用 ip addr 2.设置好了以后&#xff0c;用这两个命令&#xff0c;将网卡 up 一下&#xff0c;就可以了 //---------------------------- 使…

VBA技术资料MF79:将范围级别由工作簿变更为工作表

我给VBA的定义&#xff1a;VBA是个人小型自动化处理的有效工具。利用好了&#xff0c;可以大大提高自己的工作效率&#xff0c;而且可以提高数据的准确度。我的教程一共九套&#xff0c;分为初级、中级、高级三大部分。是对VBA的系统讲解&#xff0c;从简单的入门&#xff0c;到…

JavaEE-博客系统2(功能设计)

本部分内容&#xff1a;实现博客列表页&#xff1b;web程序问题的分析方法&#xff1b;实现博客详情页&#xff1b; 该部分的代码如下&#xff1a; WebServlet("/blog") public class BlogServlet extends HttpServlet {//Jackson ObjectMapper类(com.fasterxml.jac…

吴恩达《机器学习》6-1->6-3:分类问题、假设陈述、决策界限

一、什么是分类问题&#xff1f; 在分类问题中&#xff0c;我们试图预测的变量&#x1d466;是离散的值&#xff0c;通常表示某种类别或标签。这些类别可以是二元的&#xff0c;也可以是多元的。分类问题的示例包括&#xff1a; 判断一封电子邮件是否是垃圾邮件&#xff08;二…

软件测试工作流程

流程体系介绍 在以往的项目工作中&#xff0c;我参与过&#xff0c;需求评审、测试计划制定、测试用例编写、测试用例执行、测试脚本编写、测试脚本的执行&#xff0c;进行回归测试、验收测试、编写阶段性测试报告等工作 需求分析&#xff0c;需求评审&#xff08;RPD、产品原…

基于单片机的车载太阳能板自动跟踪系统研究

欢迎大家点赞、收藏、关注、评论啦 &#xff0c;由于篇幅有限&#xff0c;只展示了部分核心代码。 技术交流认准下方 CSDN 官方提供的联系方式 文章目录 概要 一、总体设计开发流程二、机械结构设计与研究3.1 机械系统总体设计3.1.1 太阳能板折叠传动 三、太阳能自动跟踪系统硬…

chrome插件开发:popup.html 页面获取当前页面【当前视窗】的url

chrome插件开发&#xff1a;popup.html 页面获取当前页面【当前视窗】的url 开发前的准备 在manifest页面配置上 tabs 权限&#xff0c;否则无法使用tabs接口权限 {"name": "My extension",..."permissions": ["tabs"],... }参考手…

【Linux】第十二站:进程

文章目录 1.windows和linux中的进程2.先描述3.在组织4.具体的Linux系统是如何做的&#xff1f;1.基本概念2.描述进程-PCB3.task_struct和PCB的关系4.task_struct内容分类5.linux具体如何做的&#xff1f;6.查看进程 1.windows和linux中的进程 一个已经加载到内存的程序&#xf…

python获取电脑所连接的wifi密码

电脑连接wifi后&#xff0c;很难直观地看到当前连接wifi的密码&#xff0c;需要借助命令行公管局才可以查看到相关信息。 CMD命令 查看所有已保存的wifi配置信息 netsh wlan show profiles查看某一个wifi的详细信息&#xff0c;需要输入wifi名称来查询 netsh wlan show pro…

小户型工业风,陌生上开花知书香。福州中宅装饰,福州装修

漫步陌上 只因陌上花开 花是自然的那种 朴素而恬淡&#xff0c;不落尘俗。—徐志摩 小户型工业风格 满足业主需求 筑造书香押韵家 从动线、色彩、选材、定制等各个环节 与业主一起畅谈家的构造 形成别“居”一格的温暖品质家 以书做墙 告别电视墙 这是一个实用性很强的…

鲜花展示预约小程序的内容有有哪些

鲜花店市场规模非常高&#xff0c;一方面是鲜花的用途广泛且需求量增加&#xff0c;另一方面则是入行门槛低&#xff0c;很多城市一条街就有可能汇聚了多家门店&#xff0c;尤其是节假日&#xff0c;对客流量高的门店则更加考验&#xff0c;如花束选购预约、信息展示及客户咨询…

D-Link管理系统默认账号密码

默认口令为 admin:admin 登陆成功 文笔生疏&#xff0c;措辞浅薄&#xff0c;望各位大佬不吝赐教&#xff0c;万分感谢。 免责声明&#xff1a;由于传播或利用此文所提供的信息、技术或方法而造成的任何直接或间接的后果及损失&#xff0c;均由使用者本人负责&#xff0c; 文章…

【Mybatis小白从0到90%精讲】11:Mybatis批量插入 batchInsert

文章目录 前言foreach批量插入前言 在实际开发中,我们经常需要批量插入大量数据到数据库中,而MyBatis也提供了批量插入的支持,可以大大提高插入效率。 今天要分享的是 工作中常用的在Mapper中使用foreach标签批量插入数据的方式,比在Java代码中循环调用Mapper的单条插入性…

【动手学深度学习】课程笔记 05-07 线性代数、矩阵计算和自动求导

05 线性代数 1. 基础知识补充 向量相关 矩阵相关 简单来说&#xff0c;范数是用来衡量矩阵&#xff08;张量&#xff09;大小的值&#xff0c;范数的值有不同的规定。 2. 代码实现 仅记录一些我比较陌生的知识。 张量的克隆 A torch.arange(20, dtypetorch.float32).resh…

【JAVA学习笔记】62 - 坦克大战1.2,我方发射子弹(可存在多个)

在坦克大战游戏(1.1版)基础上添加如下功能:当玩家按一下j键&#xff0c;就发射颗子弹。 个人思路&#xff0c;考虑创建bullet类&#xff0c;因为将来我们的坦克可以射出乱七八糟的子弹。定义大小&#xff0c;颜色&#xff0c;方向&#xff0c;速度&#xff0c;改变子弹位置应当…

Putty连接服务器后弹出Network error: Software caused connection abort

天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物。 每个人都有惰性&#xff0c;但不断学习是好好生活的根本&#xff0c;共勉&#xff01; 文章均为学习整理笔记&#xff0c;分享记录为主&#xff0c;如有错误请指正&#xff0c;共同学习进步。…

逆向学习记录(3)工具介绍jadx、gda和jeb

1、jadx 下载地址如下&#xff0c;目前最新版本为v1.4.7&#xff0c;改成想要下载的版本号就能下载对应的版本。 https://github.com/skylot/jadx/releases/tag/v1.4.7 下载后解压&#xff0c;进入对应路径的bin文件夹内&#xff0c;运行jadx-gui.bat。 2、gda 下载地址和gi…

1、Kubernetes简介

一、k8s 集群部署 1、k8s 快速入门 1&#xff09;、简介 Kubernetes 简称 k8s。是用于自动部署&#xff0c;扩展和管理容器化应用程序的开源系统。 中文官网&#xff1a;https://kubernetes.io/zh/ 中文社区&#xff1a;https://www.kubernetes.org.cn/ 官方文档&#xff1a;ht…