c++builder tadoquery存储过程_Electron桌面应用程序从创建项目、启动项目到打包程序的详细过程...

开发环境

本文使用环境node12.14.1+electron10.1.5+electron-builder22.9.1+electron-updater4.3.5;

操作过程

一、新建和启动项目

1. 直接使用官网示例,先克隆示例项目的仓库,然后进入该仓库;

# 克隆示例项目的仓库$ git clone https://github.com/electron/electron-quick-start# 进入这个仓库$ cd electron-quick-start

2. 安装项目依赖,安装时候会比较慢,经常安装未成功,建议先执行“npm config set registry https://registry.npm.taobao.org/”再安装依赖;

# 安装依赖$ npm install

3. 启动项目,可正常运行显示页面,即表示新建成功。

# 运行$ npm start

二、打包和升级配置

1. 本文使用electron-builder方式打包和electron-updater自动升级,先安装依赖;

# 安装electron-buildernpm install electron-builder --save-dev# 安装electron-updaternpm install electron-updater --save

2. 在package.json做如下配置;

1)“publish”用于配置升级的参数,URL为升级包地址;

2)“output”为打包的路径;

3)“nsis”为安装过程的参数,增加安装体验感;注意这里引入了icon.ico图片,记得新建文件夹build并放入相应的图片;

98a6dcdb9f2ebdaa8711a5541034646d.png

3. 修改主进程“main.js”代码:

1)feedUrl是升级包放置的路径地址;

2)updateHandle是更新函数,放置了更新过程的方法(官方都有详细解释)和发送信息;

3)使用template来使菜单中文化,便于使用;

// Modules to control application life and create native browser windowconst { app, BrowserWindow, Menu, ipcMain } = require('electron')const electron = require('electron')const { autoUpdater } = require('electron-updater')const path = require('path')function createWindow() {  // Create the browser window.  const mainWindow = new BrowserWindow({    width: 800,    height: 600,    webPreferences: {      preload: path.join(__dirname, 'preload.js'),      nodeIntegration: true    }  })  // and load the index.html of the app.  mainWindow.loadFile('index.html')  // Open the DevTools.  mainWindow.webContents.openDevTools()  let feedUrl = "http://192.168.0.107/electron-update/eqs";  //检测版本更新  updateHandle(mainWindow, feedUrl);}// This method will be called when Electron has finished// initialization and is ready to create browser windows.// Some APIs can only be used after this event occurs.app.whenReady().then(() => {  const menu = Menu.buildFromTemplate(template)  Menu.setApplicationMenu(menu) // 设置菜单部分  createWindow()  app.on('activate', function() {    // On macOS it's common to re-create a window in the app when the    // dock icon is clicked and there are no other windows open.    if (BrowserWindow.getAllWindows().length === 0) createWindow()  })})// Quit when all windows are closed, except on macOS. There, it's common// for applications and their menu bar to stay active until the user quits// explicitly with Cmd + Q.app.on('window-all-closed', function() {  if (process.platform !== 'darwin') app.quit()})// In this file you can include the rest of your app's specific main process// code. You can also put them in separate files and require them here.// 更新函数function updateHandle(window, feedUrl) {  mainWindow = window;  let message = {    error: '检查更新出错',    checking: '正在检查更新……',    updateAva: '检测到新版本,正在下载……',    updateNotAva: '现在使用的就是最新版本,不用更新',  };  //设置更新包的地址  autoUpdater.setFeedURL(feedUrl);  //监听升级失败事件  autoUpdater.on('error', function(error) {    sendUpdateMessage(mainWindow, {      cmd: 'error',      message: error    })  });  //监听开始检测更新事件  autoUpdater.on('checking-for-update', function(message) {    sendUpdateMessage(mainWindow, {      cmd: 'checking-for-update',      message: message    })  });  //监听发现可用更新事件  autoUpdater.on('update-available', function(message) {    sendUpdateMessage(mainWindow, {      cmd: 'update-available',      message: message    })  });  //监听没有可用更新事件  autoUpdater.on('update-not-available', function(message) {    sendUpdateMessage(mainWindow, {      cmd: 'update-not-available',      message: message    })  });  // 更新下载进度事件  autoUpdater.on('download-progress', function(progressObj) {    sendUpdateMessage(mainWindow, {      cmd: 'download-progress',      message: progressObj    })  });  //监听下载完成事件  autoUpdater.on('update-downloaded', function(event, releaseNotes, releaseName, releaseDate, updateUrl) {    sendUpdateMessage(mainWindow, {      cmd: 'update-downloaded',      message: {        releaseNotes,        releaseName,        releaseDate,        updateUrl      }    })    //退出并安装更新包    autoUpdater.quitAndInstall();  });  //接收渲染进程消息,开始检查更新  ipcMain.on("checkForUpdate", (e, arg) => {    //执行自动更新检查    // sendUpdateMessage(mainWindow, {cmd:'checkForUpdate',message:arg})    autoUpdater.checkForUpdates();  })}//给渲染进程发送消息function sendUpdateMessage(mainWindow, text) {  mainWindow.webContents.send('message', text)}/** * 注册键盘快捷键 * 其中:label: '切换开发者工具',这个可以在发布时注释掉 */let template = [{    label: 'Edit ( 操作 )',    submenu: [{      label: 'Copy ( 复制 )',      accelerator: 'CmdOrCtrl+C',      role: 'copy'    }, {      label: 'Paste ( 粘贴 )',      accelerator: 'CmdOrCtrl+V',      role: 'paste'    }, {      label: 'Reload ( 重新加载 )',      accelerator: 'CmdOrCtrl+R',      click: function(item, focusedWindow) {        if (focusedWindow) {          // on reload, start fresh and close any old          // open secondary windows          if (focusedWindow.id === 1) {            BrowserWindow.getAllWindows().forEach(function(win) {              if (win.id > 1) {                win.close()              }            })          }          focusedWindow.reload()        }      }    }]  },  {    label: 'Window ( 窗口 )',    role: 'window',    submenu: [{      label: 'Minimize ( 最小化 )',      accelerator: 'CmdOrCtrl+M',      role: 'minimize'    }, {      label: 'Close ( 关闭 )',      accelerator: 'CmdOrCtrl+W',      role: 'close'    }, {      label: '切换开发者工具',      accelerator: (function() {        if (process.platform === 'darwin') {          return 'Alt+Command+I'        } else {          return 'Ctrl+Shift+I'        }      })(),      click: function(item, focusedWindow) {        if (focusedWindow) {          focusedWindow.toggleDevTools()        }      }    }, {      type: 'separator'    }]  },  {    label: 'Help ( 帮助 ) ',    role: 'help',    submenu: [{      label: 'FeedBack ( 意见反馈 )',      click: function() {        electron.shell.openExternal('https://forum.iptchain.net')      }    }]  }]

4. 修改首页“index.html” ,增加发送检测升级功能:

1)增加“sendMessage.js”,用来检测更新;该实例是打开或重新加载就检测更新,可自行根据实际情况修改检测的方式;

window.onload = function() {  let ipcRenderer = require("electron").ipcRenderer;  //接收主进程版本更新消息  ipcRenderer.on("message", (event, arg) => {    console.log(arg);    if ("update-available" == arg.cmd) {      //显示升级对话框      console.log('update-available');    } else if ("download-progress" == arg.cmd) {      //更新升级进度      console.log(arg.message.percent);    } else if ("error" == arg.cmd) {      console.log('更新失败');    }    // }  });  //20秒后开始检测新版本  let timeOut = window.setTimeout(() => {    ipcRenderer.send("checkForUpdate");  }, 20000);  clearTimeout;}

2)“index.html”作如下修改,加入引入上面js的代码:

<html><head>  <meta charset="UTF-8">    <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>Hello World!title>head><body>  <h1>Hello World2!h1>  We are using Node.js <span id="node-version">span>,  Chromium <span id="chrome-version">span>,  and Electron <span id="electron-version">span>.    <script src="./renderer.js">script>  <script src="utils/sendMessage.js">script>body>html>

三、打包程序并演示升级过程

1. 执行命令“npm run build”,第一次在build的时候会因为下载文件而超时,可根据提示的网址下载相应的文件并进行手工安装;

1)下载“electron-v10.1.3-win32-x64”时(后面升级到了10.1.5,操作一样),可根据显示的(图1)url直接下载(并下载相应的SHASUMS256.txt),然后将“SHASUMS256.txt”修改为“SHASUMS256.txt-10.1.3”,并把这两个文件拷入图2位置;

8568a9081fe5df0173fdce28f7f5494a.png

4c395f58b4a6a4296d961fc49b5e48b6.png

2)下载“winCodeSign-2.6.0”时,可根据显示的(图1)url直接下载,然后把文件拷入图2位置;

714efb324fe4d5668dca2f726acd8e19.png

ad221cefa1f2a7a1945e98a67a0c3f03.png

3)下载“nsis-3.0.4.1”时,可根据显示的(图1)url直接下载,然后把文件拷入图2位置;

0ecd9625631ee37fb3c14de48e22c190.png

11eb61192373e647638f61e3283aec68.png

2. 再次执行命令“npm run build”,等待执行完毕,在release文件下生成exe文件,然后安装“test-demo Setup 1.0.0.exe”版本;

3. 修改“packgage.json”的属性“version”为2.0.0,然后执行命令“npm run build”,生成2.0安装版本;

06108ddc53ad61087b7dd51fa002feb3.png

4.  把升级文件“latest.yml”和“test-demo Setup 2.0.0.exe”放到设置的升级路径下;

1e11f04937e4c4660199c03f0237f9fe.png

5. 每次打开程序或者点击菜单的“Reload”,过20S后都会检测是否有升级包,并根据实际情况返回信息;

6. 如果升级成功会退出程序并跳到安装新程序的窗口,一步步确定即可。

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

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

相关文章

(BFS+hash去重)八数码问题

题目&#xff1a; 编号为1~8的8个正方形滑块被摆成3行3列&#xff08;有一个格子空留&#xff09;。每次可以把与空格相邻的滑块&#xff08;有公共边才算相邻&#xff09;移到空格中&#xff0c;而它原来的位置就称为了新的空格。给定初始局面和目标局面&#xff08;用0表示空…

变速后没有声音_问答 | 现代朗动at,启动后怠速不稳,热车后正常,是什么问题?...

今日老陈问答Q陈工你好&#xff1a;1.手动家车&#xff0c;停车怠速&#xff0c;有挡或空挡行驶都有异响&#xff0c;踩离合异响消失&#xff0c;抬离合异响恢复&#xff0c;换分离轴承未解决&#xff0c;压板轻磨损没更换&#xff0c;舱室粉末没清理 2.手动挡加自动变速箱油行…

怎么加载文件_Java虚拟机从入门到入土之JVM的类加载机制

作者&#xff1a;六脉神剑转载于&#xff1a;https://juejin.im/post/5e1aaf626fb9a0301d11ac8eJVM总体概述JVM总体上是由类装载子系统(ClassLoader)运行时数据区执行引擎内存回收类文件结构以上5个部分组成&#xff0c;每一个都是非常重要的&#xff0c;如果你要了解JVM&#…

的向上取整函数_计算机二级Excel常用函数解析

决定为大家推点干货让大家学习一下Excel的函数应用ABS绝对值 从最简单的开始第一个是ABS函数简而言之就是取绝对值作用就是MAX&MIN函数 这两个函数是好哥们也比较简单的就是从一堆数字中选出最大值和最小值如图C6格所示ROUND函数 四舍五入函数可不是回合ROUND 1算是比较…

多个 本地仓库_【运维工具】搭建npm私有镜像仓库,天下苦于npm build久矣

​01 前 言当你的研发团队越来越大&#xff0c;或是你无法忍受node超慢的构建时你可以考虑继续读下去&#xff0c;给大家推荐一个基于Verdaccio相对较完整的解决方案。由于环境的原因&#xff0c;我们直接去 http://npmjs.org 下载就不要考虑了&#xff0c;可以将npm config se…

地图自定义图标_如何在H5里添加地图导航?这份教程请收藏!

智能手机的出现为我们的生活带来了翻天覆地的改变&#xff0c;比如说衣食住行都有了显著的变化。外卖让就餐更加方便、手机支付也让生活更加便利&#xff0c;地图导航功能更是让大家从此不再迷路&#xff0c;有了手机以后&#xff0c;大家都开始习惯直接用手机搜索目的地&#…

c语言年月日问题思路总结 闰年非闰年每个月份的天数 解决今天是妹子出生的第多少天的问题

1.闰年非闰年每个月份的天数&#xff1a; int year[2][13]{0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31,0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };经观察发现&#xff1a; a。2月闰年有29天&#xff0c;非闰年28天 b。1、3、5、7、8、10、12月份&#xf…

aop判断方法是否执行成功_判断图中是否有环的三种方法

0、什么是环&#xff1f;在图论中&#xff0c;环&#xff08;英语&#xff1a;cycle&#xff09;是一条只有第一个和最后一个顶点重复的非空路径。在有向图中&#xff0c;一个结点经过两种路线到达另一个结点&#xff0c;未必形成环。1、拓扑排序1.1、无向图使用拓扑排序可以判…

sap运维要做哪些工作_患上腰椎间盘突出,适合做哪些工作?不适合做哪些工作?...

腰椎间盘突出的患者&#xff0c;大多数是年轻人。年轻人生活和工作压力比较大&#xff0c;大多数人都不可能因为腰椎病完全停止工作&#xff0c;事实上也不用完全停止工作&#xff0c;我们更多地应该虑如何平衡养病和工作之间的关系&#xff0c;那我们今天就来和大家讲讲&#…

bat执行exe程序_dos命令start教程,并行运行exe程序或者启动bat批处理cmd脚本

大家好&#xff0c;我是老盖&#xff0c;首先感谢观看本文&#xff0c;本篇文章做的有视频&#xff0c;视频讲述的比较详细&#xff0c;也可以看我发布的视频。今天我们学习DOS命令start这个命令&#xff0c;它可以启动一个EXE程序&#xff0c;也可以启动一个BAT批处理脚本&…

数据库备份mysql_MySQL数据库备份与恢复方法

常有新手问我该怎么备份数据库&#xff0c;下面介绍3种备份数据库的方法&#xff1a;(1)备份数据库文件MySQL中的每一个数据库和数据表分别对应文件系统中的目录和其下的文件。在Linux下数据库文件的存放目录一般为/var/lib/mysql。在Windows下这个目录视MySQL的安装路径而定&a…

(stack栈)rails

题目&#xff1a; 某城市有一个火车站&#xff0c;铁轨铺设如图所示&#xff0c;有n节车厢从A方向驶入车站&#xff0c;按进站顺序编号为1至n。你的任务是判断是否能让它们按照某种特定的顺序进入B方向的铁轨并驶出车站。为了重组车厢&#xff0c;你可以借助中转站C。这是一个…

docker 查看镜像_Docker 核心概念、安装、端口映射及常用操作命令,详细到令人发指!...

来自小洋人最HAPPY投稿一、Docker简介Docker是开源应用容器引擎&#xff0c;轻量级容器技术。基于Go语言&#xff0c;并遵循Apache2.0协议开源Docker可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中&#xff0c;然后发布到任何流行的Linux系统上&#xff0c…

(完全二叉树编号)小球下落

题目 有一棵二叉树&#xff0c;最大深度为D&#xff0c;且所有的叶子深度都相同。所有结点从上到下从左到右编号为1&#xff0c;2&#xff0c;3&#xff0c;…&#xff0c;2eD-1。在结点1处放一个小球&#xff0c;它会往下落。每个结点上都有一个开关&#xff0c;初始全部关闭…

python range 步长为负数_【Python面试】 说说Python中xrange和range的区别?

公众号新增加了一个栏目&#xff0c;就是每天给大家解答一道Python常见的面试题&#xff0c;反正每天不贪多&#xff0c;一天一题&#xff0c;正好合适&#xff0c;只希望这个面试栏目&#xff0c;给那些正在准备面试的同学&#xff0c;提供一点点帮助&#xff01;小猿会从最基…

(二叉树的动态创建与bfs)树的层次遍历

题目&#xff1a; 例&#xff1a;输入一棵二叉树&#xff0c;你的任务是按从上到下&#xff0c;从左到右的顺序输出每一个节点的值。每个节点都按照从根节点到它的移动序列给出(L表示左&#xff0c;R表示右)。在输入中&#xff0c;每个节点的左括号和右括号之间没有空格&#…

windows搭建tftp服务器_Ubuntu中搭建TFTP服务器

参考&#xff1a; 在Ubuntu中搭建TFTP服务器_小拇指的脑瓜子的博客-CSDN博客_ubuntu tftp​blog.csdn.net主要步骤&#xff1a;sudo apt-get install -y xinetd tftp tftpd2. 创建文件/etc/xinetd.d/tftp&#xff0c;内容如下&#xff1a;service tftp {socket_type dgrampro…

mysql undrop_MySQL 如何对InnoDB使用Undrop来恢复InnoDB数据

适用于&#xff1a;MySQL服务器版本4.1到5.6 [发行版4.1到5.6]本文信息适用于所有平台。目标如何使用undrop for innodb从损坏的表中提取数据解决方案使用工具有时可能从无法用innodb_force_recovery读取的表中恢复数据。undrop可以直接读取数据库的ibdata1文件&#xff0c;来获…

(二叉树DFS)天平UVa 839

题目 输入一个树状天平&#xff0c;根据力矩相等原则判断是否平衡。如图6-5所示&#xff0c;所谓力矩相等&#xff0c;就是WlDlWrDr&#xff0c;其中Wl和Wr分别为左右两边砝码的重量&#xff0c;D为距离。采用递归&#xff08;先序&#xff09;方式输入&#xff1a;每个天平的…

r语言怎么保存代码_R代码忘记保存,系统崩溃了怎么办?

R问题 跑程序时电脑突然崩溃,程序被强制中断导致代码不见了怎么办? 这些糟心的情况想必每个打工人都不想经历,偏偏我就是那个倒霉蛋,今早打开电脑发现昨晚写的代码忘记保存,心态崩到想当场飙眼泪,冷静下来之后开始寻找解决方案: 解决方案 按照下述路径找到history_datab…