electron的electron-packager打包运行和electron-builder生产安装包过程,学透 Electron 自定义 Dock 图标
electron的electron-packager打包运行和electron-builder生产安装包过程
开发electron客户端程序,打包是绕不开的问题。
macOS 应用构建,看似近在咫尺,实则坑坑致命。
场景:mac笔记本打包,以及生产出可交付的软件安装包,如何避坑,如何理解app的产生过程!!!!
可以按照我测试的路程来配置环境。包括node版本,electron版本等。
一、启动基础electron项目
- 可以看我上一篇关于electron基本操作,搭建一个简易的
index.htm作为app的页面,去尝试构架自己的第一款
二、检查是否安装了node
- 输入
node -v和npm -v查看node和npm是否安装好,可以通过nvm统一管理node版本环境,具体的操作可以看我关于nodejs环境配置的一篇博客,mac和win通用 - 我这边的nodejs版本是
v16.10.0; - 如果有期间有下载失败,那就用点程序员都懂的那个东西。

三、镜像换成淘宝
持久使用淘宝镜像
npm config set registry https://registry.npm.taobao.org
这个命令可以查看npm源地址
npm config get registry
四、electron-packager和electron-builder不同之处,使用场景,使用方法。
创建前端项目或引入前端项目, 项目目录为以下结构:
--main.js
--icons
--preload.js
--index.html
--package.json
(4.1) electron
- 开发环境安装,使用以下任意命令:
npm install --save-dev electron
cnpm install --save-dev electron
yarn add electron --dev
package.json配置内容如下:
{"name": "electron-base",//初始化的npm init生成package.json"version": "1.0.0",//项目版本号"description": "测试electron",//项目描述"main": "main.js",//入口文件"scripts": { //脚本文件"dev": "nodemon --exec electron .",},devDependencies": {"electron": "^25.3.1",}
看见我的electron版本是25.3.1
执行yarn run dev启动这个electron项目。
- 然后就启动了这个项目。是在mac本上的跑的。这里的app上面的标题中间的是
Thorough_path就是index.html的<title>Thorough_path</title>标签内容。并不是app的名字 - 在win的环境下,这个标题在左侧

main.js入口文件,配置以下内容
const {app, BrowserWindow,Menu} = require('electron');
const path = require('path');
const createWindow = ()=>{Menu.setApplicationMenu(null) // null值取消顶部菜单栏const win = new BrowserWindow({width:1000,height:800,icon: './icons/icon.ico', // 设置窗口左上角的图标webPreferences:{nodeIntegration:true,contextIsolation:false,// preload: path.join(__dirname, 'preload.js')}})win.loadFile('./index.html');//本地地址
}
app.whenReady().then(createWindow)
(4.2) electron-packager
- 安装electron-packager依赖,以下任意一种安装即可
- 开发环境安装,我安装的是
electron-packager为17.1.1
要知道的是,这是一个用于打包electron应用的工具,只是打包成各个平台下可执行文件,并不是安装包
npm install --save-dev electron-packager
cnpm install --save-dev electron-packager
yarn add electron --dev
"devDependencies": {"electron": "^25.3.1","electron-packager": "^17.1.1"}
安装成功后需要配置package.json文件
"package-mac": "electron-packager . Path --platform=darwin --electron-version=25.3.1 --download.mirrorOptions.mirror=https://npm.taobao.org/mirrors/electron/ --out=dist --icon=icons/icon.icns",
- platform:设置平台,window,linux还是Mac,darwin:代表的是mac环境,win32:代表win平台
- arch:x84还是x64,
- Path的位置可以替换成你打包后的exe名字,这里就会生成Path.exe文件。
- electron-version:electron的版本,必须要指定,这里设置为25.3.1,可查看package.json中electron安装的版本号
- out 输出文件
- icon 图标地址
执行命令 npm run packager,运行成功后就会在项目根目录中看到dist文件夹,运行exe文件就可以看到构建后的项目了。



生成一个可执行文件不用安装的文件,点击可以直接运行
(4.3) electron-builder
- 全局安装
electron-builder
- 安装electron-builder打包成安装包
全局安装或者项目开发环境安装
yarn add electron-builder -g
查看安装是否成功

使用electron-builder打包需要配置"build"
"scripts": {"dev": "nodemon --exec electron .","build": "electron-builder --win --x64"},"build": {"productName":"xxxx", // 项目名称"appId": "electron.app", // 安装包名称"directories": { "output": "build"}, // 输出文件夹"copyright":"xxxx", // 版权信息"nsis": { //nsis相关配置,打包方式为nsis时生效"oneClick": false, // 是否一键安装"allowElevation": true, // 允许请求提升,如果为false,则用户必须使用提升的权限重新启动安装程序。"allowToChangeInstallationDirectory": true, // 允许修改安装目录"installerIcon": "./build/icons/aaa.ico", // 安装图标"uninstallerIcon": "./build/icons/bbb.ico", // 卸载图标"installerHeaderIcon": "./build/icons/aaa.ico", // 安装时头部图标"createDesktopShortcut": true, // 创建桌面图标"createStartMenuShortcut": true, // 创建开始菜单图标"shortcutName": "xxxx", // 图标名称"include": "build/script/installer.nsh", // 包含的自定义nsis脚本},// 发布到githubpublish: {provider: 'github',repo: 'xxxx', // git仓库owner: 'xxxx', // 拥有者token: 'xxxxxxxxxxxxxxx', // gitTokenreleaseType: 'release',publishAutoUpdate: true // 发布自动更新(需要配置GH_TOKEN)。 默认true},//配置windows环境"win": {"icon": "build/icons/aims.ico","target": ["nsis","zip"]},//配置mac环境"mac": {"target": ["dmg","zip"]},//配置linux环境"linux": {"icon": "build/icons"}}
}
当然我这里不会配置这么全面,只是简单的进行构架配置。
"name": "electron-base",
"version": "1.0.2",
"description": "",
"main": "main.js",
"scripts": {"dev": "nodemon --exec electron .","package-mac": "electron-packager . Path --platform=darwin --electron-version=25.3.1 --download.mirrorOptions.mirror=https://npm.taobao.org/mirrors/electron/ --out=dist --icon=icons/icon.icns","build": "electron-builder --win --x64"},
"build": {"productName": "Path","appId": "Path.app","directories": {"output": "installPackages"},"mac": {"icon": "icons/icon.icns"},"win": {"icon": "icons/icon.ico","target": ["nsis"]},"nsis": {"oneClick": false,"allowToChangeInstallationDirectory": true,"perMachine": true},"electronVersion": "25.3.1","electronDownload": {"mirror": "https://npm.taobao.org/mirrors/electron/"}},


(4.2.1)nsis配置
- 这个要详细的讲一下,这个nsis的配置指的是安装过程的配置,其实还是很重要的,如果不配置nsis那么应用程序就会自动的安装在C盘。没有用户选择的余地,这样肯定是不行的
关于nsis的配置是在build中nsis这个选项中进行配置,上面是部分基础的nsis配置,NSIS对于处理安装包这种东西,功能非常的强大。但是学习起来并不比一门高级语言要容易。其中的奥秘还要各位大佬自行探索。
五、初始化项目&配置文件
统一一些的话,直接全局安装完事
全局安装electron、electron-builder、electron-packager
electron 以窗口模式启动网页程序
electron-packager 可以打包成绿色版免安装exe程序
electron-builder打包成可安装exe文件 和 绿色版免安装exe程序
npm install electron -gnpm install electron-packager -gnpm install electron-builder -g
electron 版本在淘宝镜像 https://npm.taobao.org/mirrors/electron/
打包成mac桌面app
- 学透 Electron 自定义 Dock 图标
主要增加一条执行脚本
"scripts": {"dev": "nodemon --exec electron .","build": "electron-builder --win --x64","build-mac":"electron-builder --macos "},
执行yarn run build-mac即可,等待一会就结束。


构建成功拖动安装之后,但是发现貌似icon配置项不管用。导致安装时app图标不可见,
那是因为BrowserWindow 对象的 icon 属性只对 windows/Linux 系统生效,查阅了一些,对于 Mac OS 需要通过 app.dock.setIcon 进行设置,但是貌似不管用,之后再通过查阅文档,发现这样可以解决,那就是

修改build配置项,将build配置项的icon路径前增加一个路径,虽然文件目录结构没有这个electron文件夹,但是这样写,可能会生成这个指定到electron下的icons,其实我的icons在根目录库下。
项目目录结构
--main.js
--icons
--preload.js
--index.html
--package.json
"mac": {"icon": "electron/icons/icon.icns"},"win": {"icon": "electron/icons/icon.ico","target": ["nsis"]}

dock中也有了咋们的图标,再也不是没有图像的小透明了


也算是稀里糊涂的解决了问题,不过这个electron里面的还是知识很多的,需要慢慢去看,这里就皮毛结束。加油💪🏻。
什么是.icns
.icns 是 Apple 的 macOS 操作系统的 App 图标文件的扩展名,你在 macOS 的「 Desktop 桌面」、「Finder 访达」、「Dock 程序坞」等看到应用程序的外观就是由一个内置在此 App 内部的扩展名为.icns的文件实现的。至于如何制作这样的一个macos文件,可以参考
.icns是什么,又是如何创建的
点击标题跳转↑
附上项目中完整的pack.json
{"name": "electron-base","version": "1.0.4","description": "","main": "main.js","scripts": {"dev": "nodemon --exec electron .","package-mac": "electron-packager . Path --platform=darwin --electron-version=25.3.1 --download.mirrorOptions.mirror=https://npm.taobao.org/mirrors/electron/ --out=dist --icon=icons/icon.icns","build": "electron-builder --win --x64","build-mac":"electron-builder --macos "},"build": {"productName": "Path","appId": "Path.app","directories": {"output": "installPackages"},"mac": {"icon": "electron/icons/icon.icns"},"win": {"icon": "electron/icons/icon.ico","target": ["nsis"]},"nsis": {"oneClick": false,"allowToChangeInstallationDirectory": true,"perMachine": true},"electronVersion": "25.3.1","electronDownload": {"mirror": "https://npm.taobao.org/mirrors/electron/"}},"keywords": [],"author": "","license": "ISC","dependencies": {},"devDependencies": {"electron": "^25.3.1","electron-packager": "^17.1.1"}
}
main.js
const {app, BrowserWindow,Menu} = require('electron');
const path = require('path');
const createWindow = ()=>{Menu.setApplicationMenu(null) // null值取消顶部菜单栏const win = new BrowserWindow({width:1000,height:800,icon: './icons/icon.ico', // 设置窗口左上角的图标webPreferences:{nodeIntegration:true,contextIsolation:false,// preload: path.join(__dirname, 'preload.js')}})if (process.platform == 'darwin') {// app.dock.setIcon(path.join(__dirname, 'electron/icons/icon.icns'));}// win.loadURL('https://niupeng.inscode.cc/qianduan');//线上地址win.loadFile('./index.html');//本地地址// win.webContents.openDevTools();//打开开发者工具// process.env['ELECTRON_DISABLE_SECURITY_WARNINGS'] = 'true';}
app.whenReady().then(createWindow)

相关文章:
electron的electron-packager打包运行和electron-builder生产安装包过程,学透 Electron 自定义 Dock 图标
electron的electron-packager打包运行和electron-builder生产安装包过程 开发electron客户端程序,打包是绕不开的问题。 macOS 应用构建,看似近在咫尺,实则坑坑致命。 场景:mac笔记本打包,以及生产出可交付的软件安装…...
【无标题】深圳卫视专访行云创新马洪喜:拥抱AI与云原生,深耕云智一体化创新
人工智能(AI)是引领新一轮科技革命和产业变革的重要驱动力。因此,深圳出台相关行动方案,统筹设立规模1,000亿元的人工智能基金群,引导产业集聚培育企业梯队,积极打造国家新一代人工智能创新发展试验区和国家…...
jenkins通过流水线进行构建jar包
前言 最近项目上需要进行CICD,本篇博客主要分享各种骚操作 目录 前言操作如下:构建触发器测试哈哈操作如下: 1.下载Jenkins.war包上传到服务器上面,然后在同级目录下面创建如下脚本: #!/bin/bash# Jenkins安装目录 JENKINS_HOME=/usr/local/jenkins# Jenkins日志文件 LO…...
Android开发:通过Tesseract第三方库实现OCR
一、引言 什么是OCR?OCR(Optical Character Recognition,光学字符识别)是指电子设备(例如扫描仪或数码相机)检查纸上打印的字符,通过检测暗、亮的模式确定其形状,然后用字符识别方法将形状翻译成计算机文字的过程。简单地说&#…...
合并两个有序链表——力扣21
题目描述 法一 递归 class Solution { public:ListNode* mergeTwoLists(ListNode *l1, ListNode*l2){if(l1 nullptr){return l2;} else if (l2nullptr){return l1;} else if (l1->val<l2->val){l1->next mergeTwoLists(l1->next, l2);return l1;} else {l2-&g…...
企业数据,大语言模型和矢量数据库
随着ChatGPT的推出,通用人工智能的时代缓缓拉开序幕。我们第一次看到市场在追求人工智能开发者,而不是以往的开发者寻找市场。每一个企业都有大量的数据,私有的用户数据,自己积累的行业数据,产品数据,生产线…...
LabVIEW使用支持向量机对脑磁共振成像进行图像分类
LabVIEW使用支持向量机对脑磁共振成像进行图像分类 医学成像是用于创建人体解剖学图像以进行临床研究、诊断和治疗的技术和过程。它现在是医疗技术发展最快的领域之一。通常用于获得医学图像的方式是X射线,计算机断层扫描(CT),磁…...
kafka面试题
kafka基本概念 Producer 生产者:负责将消息发送到 BrokerConsumer 消费者:从 Broker 接收消息Consumer Group 消费者组:由多个 Consumer 组成。消费者组内每个消费者负责消费不同分区的数据,一个分区只能由一个组内消费者消费&am…...
树的遍历(一题直接理解中序、后序、层序遍历,以及树的存储)
题目如下: 一个二叉树,树中每个节点的权值互不相同。 现在给出它的后序遍历和中序遍历,请你输出它的层序遍历。 输入格式 第一行包含整数 N,表示二叉树的节点数。 第二行包含 N 个整数,表示二叉树的后序遍历。 第…...
JVM系统优化实践(22):GC生产环境案例(五)
您好,这里是「码农镖局」CSDN博客,欢迎您来,欢迎您再来~ 除了Tomcat、Jetty,另一个常见的可能出现OOM的地方就是微服务架构下的一次RPC调用过程中。笔者曾经经历过的一次OOM就是基于Thrift框架封装出来的一个RPC框架导…...
DevOps系列文章 之GitLabCI模板库的流水线
目录结构,jobs目录用于存放作业模板。templates目录用于存放流水线模板。这次使用default-pipeline.yml作为所有作业的基础模板。 作业模板 作业分为Build、test、codeanalysis、artifactory、deploy部分,在每个作业中配置了rules功能开关&…...
spring扩展点ApplicationContextAware解释
ApplicationContextAware是Spring框架中的一个扩展接口,用于获取和操作应用程序上下文(ApplicationContext)。通过实现ApplicationContextAware接口,可以在Bean中获取对应用程序上下文的引用,并进行进一步的操作。 具…...
力扣热门100题之最大子数组和【中等】【动态规划】
题目描述 给你一个整数数组 nums ,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。 子数组 是数组中的一个连续部分。 示例 1: 输入:nums [-2,1,-3,4,-1,2,1,-5,4] 输出&a…...
导出为PDF加封面且分页处理dom元素分割
文章目录 正常展示页面导出后效果代码 正常展示页面 导出后效果 代码 组件内 <template><div><div><div class"content" id"content" style"padding: 0px 20px"><div class"item"><divstyle"…...
【C++入门】浅谈类、对象和 this 指针
文章目录 一、前言二、类1. 基本概念2. 类的封装3. 使用习惯成员函数定义习惯成员变量命名习惯 三、对象1. 基本概念2. 类对象的存储规则 四、this 指针1. 基本概念2. 注意事项3. 经典习题4. 常见面试题 一、前言 在 C 语言中,我们用结构体来描述一个事物的多种属性…...
【Linux命令200例】indent对C语言代码进行缩进和格式化
🏆作者简介,黑夜开发者,全栈领域新星创作者✌,2023年6月csdn上海赛道top4。 🏆本文已收录于专栏:Linux命令大全。 🏆本专栏我们会通过具体的系统的命令讲解加上鲜活的实操案例对各个命令进行深入…...
Hive 调优集锦(1)
一、前言 1.1 概念 Hive 依赖于 HDFS 存储数据,Hive 将 HQL 转换成 MapReduce 执行,所以说 Hive 是基于Hadoop 的一个数据仓库工具,实质就是一款基于 HDFS 的 MapReduce 计算框架,对存储在HDFS 中的数据进行分析和管理。 1.2 架…...
【C++详解】——智能指针
目录 为什么需要智能指针 抛异常引发内存泄漏 内存泄漏 什么是内存泄漏,内存泄漏的危害 内存泄漏分类 检测内存泄漏常用工具 如何避免内存泄漏 智能指针的使用及原理 RAII 智能指针的原理 各类智能指针介绍 auto_ptr unique_ptr shared_ptr weak_ptr …...
Jmeter接口/性能测试,Jmeter使用教程(超细整理)
目录:导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜) 前言 1、线程组 线程组…...
59,综合案例-演讲比赛流程管理系统
演讲比赛流程管理系统 59.1案例描述59.1.1比赛规则59.1.2程序功能 59.2创建管理类59.3菜单功能59.3.1添加成员函数59.3.2菜单功能实现 59.4退出功能59.4.1提供功能接口59.4.2实现退出功能 59.5演讲比赛功能59.5.1创建选手类59.5.2比赛59.5.2.1成员属性添加59.5.2.2初始化属性59…...
ES6从入门到精通:前言
ES6简介 ES6(ECMAScript 2015)是JavaScript语言的重大更新,引入了许多新特性,包括语法糖、新数据类型、模块化支持等,显著提升了开发效率和代码可维护性。 核心知识点概览 变量声明 let 和 const 取代 var…...
Nuxt.js 中的路由配置详解
Nuxt.js 通过其内置的路由系统简化了应用的路由配置,使得开发者可以轻松地管理页面导航和 URL 结构。路由配置主要涉及页面组件的组织、动态路由的设置以及路由元信息的配置。 自动路由生成 Nuxt.js 会根据 pages 目录下的文件结构自动生成路由配置。每个文件都会对…...
相机Camera日志分析之三十一:高通Camx HAL十种流程基础分析关键字汇总(后续持续更新中)
【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了:有对最普通的场景进行各个日志注释讲解,但相机场景太多,日志差异也巨大。后面将展示各种场景下的日志。 通过notepad++打开场景下的日志,通过下列分类关键字搜索,即可清晰的分析不同场景的相机运行流程差异…...
GitHub 趋势日报 (2025年06月08日)
📊 由 TrendForge 系统生成 | 🌐 https://trendforge.devlive.org/ 🌐 本日报中的项目描述已自动翻译为中文 📈 今日获星趋势图 今日获星趋势图 884 cognee 566 dify 414 HumanSystemOptimization 414 omni-tools 321 note-gen …...
Reasoning over Uncertain Text by Generative Large Language Models
https://ojs.aaai.org/index.php/AAAI/article/view/34674/36829https://ojs.aaai.org/index.php/AAAI/article/view/34674/36829 1. 概述 文本中的不确定性在许多语境中传达,从日常对话到特定领域的文档(例如医学文档)(Heritage 2013;Landmark、Gulbrandsen 和 Svenevei…...
使用Matplotlib创建炫酷的3D散点图:数据可视化的新维度
文章目录 基础实现代码代码解析进阶技巧1. 自定义点的大小和颜色2. 添加图例和样式美化3. 真实数据应用示例实用技巧与注意事项完整示例(带样式)应用场景在数据科学和可视化领域,三维图形能为我们提供更丰富的数据洞察。本文将手把手教你如何使用Python的Matplotlib库创建引…...
安宝特案例丨Vuzix AR智能眼镜集成专业软件,助力卢森堡医院药房转型,赢得辉瑞创新奖
在Vuzix M400 AR智能眼镜的助力下,卢森堡罗伯特舒曼医院(the Robert Schuman Hospitals, HRS)凭借在无菌制剂生产流程中引入增强现实技术(AR)创新项目,荣获了2024年6月7日由卢森堡医院药剂师协会࿰…...
LOOI机器人的技术实现解析:从手势识别到边缘检测
LOOI机器人作为一款创新的AI硬件产品,通过将智能手机转变为具有情感交互能力的桌面机器人,展示了前沿AI技术与传统硬件设计的完美结合。作为AI与玩具领域的专家,我将全面解析LOOI的技术实现架构,特别是其手势识别、物体识别和环境…...
WPF八大法则:告别模态窗口卡顿
⚙️ 核心问题:阻塞式模态窗口的缺陷 原始代码中ShowDialog()会阻塞UI线程,导致后续逻辑无法执行: var result modalWindow.ShowDialog(); // 线程阻塞 ProcessResult(result); // 必须等待窗口关闭根本问题:…...
命令行关闭Windows防火墙
命令行关闭Windows防火墙 引言一、防火墙:被低估的"智能安检员"二、优先尝试!90%问题无需关闭防火墙方案1:程序白名单(解决软件误拦截)方案2:开放特定端口(解决网游/开发端口不通)三、命令行极速关闭方案方法一:PowerShell(推荐Win10/11)方法二:CMD命令…...
