安装包UI美化之路-通过nsNiuniuSkin来做Electron程序的打包、发布与升级

news2025/7/18 10:47:06

nsNiuniuSkin从发布之初,因其简单、简洁、高效,受到了非常多公司的青睐,现在已经越来越多的公司采用我们的这套解决方案来制作安装包了!

从一个安装包UI插件,逐步演化成一套集美观、安全、简洁、自动化为一体的完整的解决方案,实属不易,感谢所有朋友的信任!

前言

网上有不少关于Electron安装包美化的文章,有使用sciter的,有使用QT的,也有基于我们早期版本进行深度或简单集成的;整体看下来,这些方案多少会有一点问题:

  • 使用sciter和QT,增加了不少体积
  • 没有完整的与Electron打包升级完整整合

而现在Electron应用非常广泛,Electron应用程序的安装包制作,当然少不了我们;在翻看了electron-builder和electron-updater源码后,再结合反解Electron应用程序的安装包脚本,我们了解了其运作的机制,实现了一套与Electron打包无缝对接的方案,完全支持自动化,兼容electron程序的升级。

之前有了解到有一个朋友做Electron安装包的美化,前后花费了一个月时间的,真的让人痛心!希望有了我们的方案,大家能够在一天内完成安装包的制作以及升级功能的对接。

原理

在实际介绍nsNiuniuSkin的Electron安装包制作方案之前,我们需要讲清楚几个原理:

electron-builder在Windows上默认使用NSIS进行打包

electron-builder内置了很多模板化的nsis脚本,在package.json中的关于nsis的设置,将会通过参数的形式,结合模板,最终形成完整的打包脚本,进而生成安装包。 如果你有想不明白的打包与升级的问题,基本都可以在electron-builder的源码中找到相关的答案或者资料。

electron-updater的升级思路

此处我们只讲全量更新,electron-updater升级流程如下:

  1. 在electron-builder打包时,通过配置,会在resources目录下生成一个app-update.yml配置文件,其中包含了当前的版本号,以及升级检测的服务端地址;同时会生成一个elevate.exe的程序(用于在升级包需要管理员权限运行时进行提权)
  2. electron-builder打包完成后,会同步生成一个叫latest.yml文件,其中写了最新的版本号、大小、文件的SHA512哈希值等信息;这些信息将作为客户端升级校验的基础(打包后需要将latest.yml以及安装包放到指定的服务器上)
  3. 客户端运行时,electron-updater下载服务器的latest.yml,与本地的进行对比,判断是否有新版本
  4. 下载latest.yml中安装包文件名对应的文件,并校验其SHA512与大小是否与配置文件中一致
  5. 退出当前主进程,调用新的安装包,并传递--updated --force-run /S等参数(--force-run /S根据updater配置逐项增加)

我们的实现方案

知道了Electron打包与升级的逻辑,我们的Electron打包方案就变的容易了,处理细节较多,这里我们主要介绍几个技术要点:

  1. 自动读取Electron目录下的package.json中的版本号以及guid,这两个信息对于安装包非常重要
  2. 支持从外部指定安装包名、安装权限、安装到当前用户还是所有用户等
  3. 调用Electron打包命令,生成unpacked files,并复制到我们的打包目录下
  4. 安装包打包完成后,自动签名,同时生成latest.yml配置文件,达到完全兼容electron-updater升级的效果
  5. 自动处理electron-updater传递过来的命令行参数,将升级行为处理成与原生的electron打包的安装包一致

我们的优势

有人会说Electron自己的打包就是这样,你做的这些有什么意义呢?

意义非常大,且听我道来:

  1. 我们的安装包UI高度美观,且可以随意扩展
  2. 我们的安装包自带防解包功能,安全性上比Electron自己打出来的更高
  3. 我们的安装包方案中,自带一键生成在线安装包,网站上可以只发布非常小的一个预安装程序即可
  4. 我们除了生成与electron-updater完全匹配的升级包以外,同时支持更灵活的升级方案
  5. 一键式打包,同步生成卸载程序及其签名,防误报

打包示例与效果展示

说了这么多,都是理论性的东西,直接看脚本和效果吧,不需要复杂的配置,直接执行打包脚本即可。

package.json脚本

在打包脚本目录下,我们提供了一份名叫NiuNiuCaptureElectronDemo的electron源码,其中已经包含了基本的打包脚本package.json的配置,以及基本的升级相关的代码。

package.json的部分配置如下:

{
  "name": "TestCapture",
  "version": "1.0.0",
  "main": "main.js",
  "description": "",
  "author": "support@leeqia.com",
  "build": {
    "appId": "appid",
    "nsis": {
      "guid": "Test_Capture"  
    },
    "extraFiles": [
      "capture"
    ],
    "win": {
      "target": "dir",
      "icon": "app.ico"
    },
    "publish": [
      {
        "provider": "generic",
        "url": "http://127.0.0.1:8080/upload/"
      }
    ]
  }
}

上述打包脚本配置,表示我们的一些核心配置如下:

  • 版本号为1.0.0
  • 安装包在注册表中的标识key为Test_Capture
  • 指定升级包下载路径等
  • 我们依赖的electron和electron-builder的版本如上,如果你机器上的版本不一样,请相应调整

build-for-electron.bat脚本

同时我们提供了一份build-for-electron.bat的脚本,默认已经配置成正常打包NiuNiuCaptureElectronDemo下的应用程序;脚本部分代码如下(实际应用中只需要修改大概4-5个字段,output_setup_prefix、electron_build_path、shell_all_user_mode、install_execution_level):

@rem 打包脚本项目名称
@set project_name=leeqia_general
@rem 安装包名前缀 
@set output_setup_prefix=LeeqiaCapture_PC_Setup_

@rem 主程序名称 (可根据你的项目自行调整)
@set main_exe_name=TestCapture.exe

@rem electron程序中打包的guid,用于安装在注册表中的key(卸载与软件信息)
@set electron_guid=
@rem 软件版本号
@set electron_app_version=
@rem 是安装到所有用户下,还是安装到当前用户下,all/current
@set shell_all_user_mode=all
@rem 安装包的启动权限,user/admin
@set install_execution_level=admin
@rem electron项目所在目录
@set electron_build_path=.\NiuNiuCaptureElectronDemo
@set electron_unpacked_dir=%electron_build_path%\dist\win-unpacked
@rem 读取yml文件,提取版本号和guid信息
.\Helper\NSISHelper.exe --mode="get_electron_app_info" --src="%electron_build_path%\package.json" --dst=".\get_electron_app_version.bat"
Call get_electron_app_version.bat
@echo %electron_app_version%
@echo %electron_guid%
@rem 完整的安装包名称
@set output_setup_file_name=%output_setup_prefix%%electron_app_version%.exe
@rem 打包,生成unpacked files (如果你的打包脚本是其他的,则修改此处,在具体环境中打包可能报错,需要调整package.json中的electron和electron-builder的版本号)
cd %electron_build_path%
call npm run build

执行build-for-electron.bat,就可以开始打包了,他将会做几件事:

  • 提取package.json中的guid和version字段,传递给后续的打包流程
  • 进入electron应用程序所在目录下,执行打包脚本npm run build
  • 复制dis\win-unpacked下的文件
  • 执行安装包打包(包含卸载程序、安装程序的打包与签名)
  • 生成最终安装包的latest.yml

以下是我们的打包脚本执行过程:

 

打包完成后,最终打包出来的安装包程序:

 

安装效果如下:

开始安装:

 

安装中:

 

升级效果展示

在上一节中,我们已经打出来了1.0.0版本的安装包LeeqiaCapture_PC_Setup_1.0.0.exe,并且已经安装到电脑上进行使用;接下来我们演示一下打出新的版本,放到升级目录下,触发旧版本的升级。

我们先需要搭建一个简单的静态http服务器,安装http-server模块即可。

安装后,我们新建立目录e:\testweb\update,然后在e:\testweb目录下下执行: http-server 此时升级服务器就算是准备好了。

我们将package.json中的version字段改为1.0.1,并再次执行build-for-electron.bat进行打包,此时我们会得到两个文件:

  • LeeqiaCapture_PC_Setup_1.0.1.exe
  • latest.yml

我们将打好的安装包和升级文件复制到e:\testweb\update目录下,然后运行之前安装好的1.0.0版本的测试程序:

 

此时将会弹出检测到新版本的安装包,是否进行升级的提示,点击确认,升级就开始了,升级完成后,会自动再次拉起主程序来。

 

与旧的Electron应用程序的兼容

如果之前已经通过electron打包发布了的程序,替换成由nsNiuniuSkin打的安装包,要如何与旧的版本完全兼容呢?

这是非常重要的一点,也是众多Electron开发者在切换安装包打包工具时的困惑所在。

我们之所以要读取package.json中的guid,就是想要实现与旧版本兼容。只要知道了它,我们就能够在脚本中定位原来旧的Electron安装包的安装位置,可以进一步进行覆盖安装。

当然要处理的细节还是比较多的,比如:

  • 安装路径的读取与写入 安装位置,我们使用的key值是InstPath,而Electron使用的key值是InstallLocation;我们在接下来会介绍的build-by-external.bat(build-for-electron.bat也是调用这个脚本)中,预留了可以设置此值的参数,并且指定为InstallLocation,所以Electron程序打包默认都会指定这个值,也就与旧版本匹配了。
  • 快捷方式的替换 快捷方式比较简单,只要前后的快捷方式名称一致,且与旧版本安装包的安装配置(是安装到所有用户还是当前用户)一致即可
  • 开始菜单的处理 与快捷方式同理

不光如此,类似的其他方案制作的安装包,要无缝的切换成我们的安装包方案,也是很简单的:

我们在脚本中内置了注册表key的默认值,只需要将其修改成您旧的程序写的key即可确保读写用的是同一个键值。

灵活的集成方案,兼顾不同的打包方式与场景

在我们的打包方案中,我们提供了两种形式的打包脚本,同时兼顾不同场景的打包需求:

主动打包

之所以称之为主动打包,是因为打包的触发入口是在我们的打包入口脚本中,我们提供了一个叫build-for-electron.bat脚本,在其中只要配置好以下几点,就可以开始打包了(上面的示例已经介绍):

  • electron应用程序所在的目录
  • electron应用程序主程序的文件名
  • electron应用程序的安装包名前缀等

被动打包

被动打包的意思是说打包的触发点不在我们这边,而是有其他流程已经打出来了unpacked files,并且已经复制到了我们要打包的目录下,需要调用我们的脚本打包成最终的安装包,同时生成latest.yml文件。 如果当前已经有了较为完整的打包自动化流程,只是想切换到nsNiuniuSkin的打包方案中,可以试着在你们的流程中调用build-by-external.bat脚本,并传递指定的参数即可,脚本参数较多,如下:

Call build-by-external.bat project_name electron_guid electron_app_version output_setup_file_name shell_all_user_mode install_execution_level file_pack_path main_exe_name gen_latest

脚本部分代码如下(命令行参数每个参数的解释都在脚本代码中了):

@rem 此脚本表示外部已经打好electron的unpacked files,并且已经复制到我们的FilesToInstall下,我们只需要相应的打包成最终的安装包即可 
@rem 打包脚本名称,如leeqia_simple,对于于SetupScripts目录下的具体文件夹名称
@set project_name=%1
@rem electron中配置的guid,用于指定注册表中的key
@set electron_guid=%2
@rem 软件版本号
@set electron_app_version=%3
@rem 完整的安装包名
@set output_setup_file_name=%4
@rem 是安装到所有用户下,还是安装到当前用户下,all/current
@set shell_all_user_mode=%5
@rem 安装包的启动权限,user/admin
@set install_execution_level=%6
@rem 等待打包文件所在目录名,默认为FilesToInstall
@set file_pack_path=%7
@rem 主程序EXE名称
@set main_exe_name=%8
@rem 是否生成latest.yml,用于electron相关程序的打包 
@set gen_latest=%9
@rem 注册表中安装包位置存储的key值
@set install_location_key=InstallLocation

总结

看完上述的介绍与演示,是不是觉得非常简单呢? 所有复杂的逻辑以及需要与electron-updater交互的地方,都由我们安装包制作方案自动完成,提供出统一的接口。

整个过程非常简单,配置build-for-electron.bat中的各个参数(如果你的electron-builder的配置文件还没配置好,也需要配置下),然后执行此脚本,安装包就打包好了。

你对Electron应用的安装包美化和升级还有什么疑惑么?有机会一起探讨一下吧。

结语

在安装包安装过程中,精美的UI往往能让客户对所安装产品的印象更加深刻,更能体现出软件服务商在用户体验上的专注与用心! 希望我们的努力,能够让安装包制作再容易一点,再快乐一点!今后Electron程序的打包,就交给我们吧!^_^

愿天下没有难做的安装包!

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

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

相关文章

ModBus RTU与ModBus TCP通信协议详解

1、Modbus简介 Modbus通信协议由Modicon公司(现已经为施耐德公司并购,成为其旗下的子品牌)于1979年发明的,是全球最早用于工业现场的总线规约。由于其免费公开发行,该协议免费使用,Modbus通信协议采用的是主…

电力电子技术复习笔记

绪论电力电子器件直流-直流直流直流动态模型整流电路逆变电路:有源逆变软开关电路期末绪论 电力电子技术:使用电力电子器件对电能进行转换和控制的技术 电力电子技术和信息电子技术的本质区别: 电力电子技术主要用于电能变换 信息电子技术…

2023什么蓝牙耳机好用不贵?适合学生党的国产蓝牙耳机推荐

蓝牙耳机因为摆脱了线的束缚,在日常生活中解放了双手,使用更便捷。现如今的蓝牙耳机越来越多,每款耳机都有自己的侧重。下面,我来给大家推荐几款好用不贵发国产蓝牙耳机,一起来看看吧。 一、南卡小音舱蓝牙耳机 参考…

Linux操作系统基础知识命令参数详解

Linux操作系统 RAID分组 RAID JBOD RAID JBOD的意思是Just a Bunch Of Disks,是将多块硬盘串联起来组成一个大的存储设备,从某种意义上说这种类型不被算作RAID,在维基百科里JBOD同时也被归入非RAID架构。RAID JBOD将所有的磁盘串联成一个单…

【聚类指标】如何评估聚类算法:外部指标和内部指标、指标详解

【聚类指标】如何评估聚类算法:外部指标和内部指标、指标详解 文章目录【聚类指标】如何评估聚类算法:外部指标和内部指标、指标详解1. 前言2. 外部指标2.1 P(Purity)2.1.1 例子2.2 NMI(Normalized Mutual Information…

PHP基础(1)

PHP基础PHP简介解析器最简单的PHP文件传值与传址输出函数数据类型数据类型比较单双引号的区别字符串及常用函数PHP简介 PHP是最常用的动态web开发语言,用于开发动态网站。常见的动态web开发语言还有: asp aspx.jsp(javaweb)。PHP可以嵌入到html中执行,使…

webpack打包ts代码

webpack整合 通常情况下,实际开发中我们都需要使用构建工具对代码进行打包; TS同样也可以结合构建工具一起使用,下边以webpack为例介绍一下如何结合构建工具使用TS; 步骤如下: (1)初始化项目 进入项目根目录&…

IDE 文档注释使用,模板注释,ide配置templates

文档注释基于javadoc模板 类注释 /*** 暂无介绍** author admin* version 1.0.0* <dt><span class"simpleTagLabel">时间:</span></dt>* <dd>2023/2/24</dd>*/方法注释 /*** 暂无描述** author admin* param args */javadoc相…

PowerShell Install Redis

Redis 前言 Redis&#xff08;Remote Dictionary Server )&#xff0c;即远程字典服务&#xff0c;是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库&#xff0c;并提供多种语言的API。 Redis dowload Redis WindowsdownloadRedi…

字节在职5年,一个测试工程师的坎坷之路

几年前进入到IT行业&#xff0c;现在发现学习软件测试的人越来越多&#xff0c;今天我想根据自己的行业经验给大家提一些建议。 跟其他行业相比&#xff0c;做软件测试的岗位确实算是高薪职业&#xff0c;我们那个时候起步的工资并不高&#xff0c;而看现在很多毕业的学生薪资都…

Scala-面向对象引入(包、类和对象)

包 包对象 导包 类和对象 方法和构造器 包 Scala 包的三大作用&#xff08;和 Java 一样&#xff09;&#xff1a; 区分相同名字的类当类很多时&#xff0c;可以很好的管理类控制访问范围 基本语法 package 包名 Scala 有两种包的管理风格&#xff0c;一种方式和 Java …

Transformer模型

图1图2第一张图transfomer模型图&#xff0c;第二张图是是以各个功能模块的形式来呈现transformer的。 在这里我们来讲transformer的几个关键技术: 1.encoder部分的位置嵌入 2.encoder部分的多头注意力机制 3.残差连接 4.LayerNormalization 5.decoder部分的多头注意力的…

如何使用U-Mail搭建企业邮件服务器?

在当今的信息时代&#xff0c;企业也应该跟上时代的步伐。做好企业信息化建设&#xff0c;对企业事业单位尤为重要。电子邮件作为企业信息化过程中的重要组成部分&#xff0c;在企业内部沟通和外部沟通中发挥着重要作用。目前&#xff0c;有实力的企业已经开始倾向于自己搭建邮…

SpringBoot2 黑马 运维实用 01 工程打包与运行

文章目录打包Windows环境运行Windows端口占用使用的排查指令Linux环境运行Linux常用命令jar包导入linux启动jar打包 使用Maven-项目-生命周期-package或者输入命令 mvn package 打包后是一个 .jar 后缀的压缩包 classes是你写的代码 lib是程序运行所依赖的所有jar包 org是启动…

Jenkins配置项目教程

在上一篇[Jenkins的使用教程](https://blog.csdn.net/weixin_43787492/article/details/129028131?spm1001.2014.3001.5501)中我介绍了如何创建一个项目 Jenkins在创建项目中提供了很多功能供我们选择&#xff0c;这里我将对配置项目做一个较完整的介绍Jenkins配置项目0、所有…

ChatGPT 的工作原理:机器人背后的模型

这篇对支持 ChatGPT 的机器学习模型的温和介绍&#xff0c;将从大型语言模型的介绍开始&#xff0c;深入探讨使 GPT-3 得到训练的革命性自我注意机制&#xff0c;然后深入研究人类反馈的强化学习&#xff0c;使 ChatGPT 与众不同的新技术。 大型语言模型 ChatGPT 是一类被称…

mybatis入门配置

mybatis mybatis是一款持久层框架&#xff0c;用于简化JDBC开发 持久层&#xff1a;负责将数据保存到数据库的那一层代码JavaEE的三层架构&#xff1a;表现层、业务层、持久层、&#xff0c;就相当与mvc设计模式过程中的Controller、service、dao 1.创建一个maven模块&#…

【离线数仓-7-数据仓库开发DIM层设计要点-每日全量表同步】

离线数仓-7-数据仓库开发DIM层设计要点-每日全量表同步离线数仓-7-数据仓库开发DIM层设计要点-每日全量表同步1.DIM层 维度模型 设计要点1. 维度表的相关设计2.维度表 设计要点2.DIM层 各维度表分析1.商品维度表1.商品维度表 前期梳理2.商品维度表 DDL表设计分析3.商品维度表 加…

JM员工福利与健康平台,企业关怀Always Online

庄信万丰(Johnson Matthey, JM)&#xff0c;全球性专用化学品公司&#xff0c;是可持续发展技术的全球领导者。在30多个国家和地区拥有13000多名员工。 JM的价值观之一是保护人类和地球。在生产过程中&#xff0c;JM保持对环境保护和能源清洁的高度关注&#xff1b;在员工福利…

MySQL简介、M有SQL的存储引擎、表、字段和数据

Java知识点总结&#xff1a;想看的可以从这里进入 目录2、MySQL特性介绍2.1、MySQL简介2.2、存储引擎2.3、表、字段、数据2、MySQL特性介绍 2.1、MySQL简介 MySQL 是一个关系型数据库管理系统&#xff08;RDBMS&#xff09;&#xff0c;于2009年被 Oracle 公司收购。它是一种关…