Open eyasliu opened 6 years ago
写的很详细,👍👍👍赞一个
非常感谢, 省走很多路
https://github.com/wxnacy/study/tree/master/node/electron/electron-builder https://github.com/QDMarkMan/CodeBlog/blob/master/Electron/electron-builder%E6%89%93%E5%8C%85%E8%AF%A6%E8%A7%A3.md https://github.com/QDMarkMan/electron-builder-start/blob/master/package.json https://wxnacy.com/2018/05/10/use-electron-builder/ https://www.javascriptcn.com/read-5865.html
最近需要
很详细
最近边做边学也做了个小工具 (https://github.com/Symbolk/SmartCommit/ ),但是貌似现在windows下有更新无法弹出提醒,不知道怎么解决,看来是open两年的issue了:
https://github.com/electron-userland/electron-builder/issues/2700 https://github.com/electron/electron/issues/10864
请问我 再nsis中设置了 LICENCE.txt 这个文件后,打包完成显示的是乱码怎么解决?我试了UTF-8 等都不行呢。
@ideacco 我倒是没遇到乱码问题,你先确定一下你的nsis的字符编码是什么(其实我也不会看),再转成对应的字符编码。或者你可以先试试转成 ANSI ,或者转成UTF8带BOM的格式
@ideacco我倒是没遇到乱码问题,你先确定一下你的nsis的字符编码是什么(其实我也不会看),再转成对应的字符编码。或者你可以先试试转成ANSI,或者转成UTF8带BOM的格式
好的,我已经解决了
最近发现一个坑,我有一个拖拽文件上传的功能,在开发测试的时候没有问题的,但是打包之后,win10系统在拖拽的时候就会出现一个禁止的图标,然后无法触发鼠标监听了,同样的程序在WIN7 和MAC下没有任何问题,在WIN10 的开发环境下也没有问题,打包了就出问题了。 目前还在寻找解决方案,哪位有爬过坑的希望帮个忙呗谢啦
最近发现,在设置了autoInstallOnAppQuit = true之后,虽然可以在退出后安装更新包,但部分用户反应桌面快捷方式失效,双击快捷方式后提示快捷方式存在问题,不知道哪里出的问题
请问安装和卸载完成之后弹网页怎么做?
@smi1lee 按照 NSIS文档的说法,通过调用系统命令实现,你可以试试用 Exec "explorer" "https://www.xxxx.com"
,我没有试过不确定行不行,或者你可以试试把 NSIS文档那个函数复制直接用
@smi1lee 按照 NSIS文档的说法,通过调用系统命令实现,你可以试试用
Exec "explorer" "https://www.xxxx.com"
,我没有试过不确定行不行,或者你可以试试把 NSIS文档那个函数复制直接用
我是写了个 Function un.onUninstSuccess HideWindow ExecShell "open" "https://www.xxxx.com" FunctionEnd 但是好像是和electron-builder里面是有冲突的 还有一个检测程序是否在运行,虽然文档里面没有写,我看了源码是有可以自己定义的,不过我的环境好像出问题了,现在一build就报错
!include logiclib.nsh !include x64.nsh !include nsProcess.nsh SilentInstall normal
!macro customCheckAppRunning ${GetProcessInfo} 0 $pid $1 $2 $3 $4 ${if} $3 != "${APP_EXECUTABLE_FILENAME}" ${if} ${isUpdated}
Sleep 100
${endIf}
${nsProcess::FindProcess} "${APP_EXECUTABLE_FILENAME}" $R0
${if} $R0 == 0
${if} ${isUpdated}
# allow app to exit without explicit kill
Sleep 1000
Goto doStopProcess
${endIf}
Push "0"
Quit
doStopProcess:
DetailPrint `Closing running "${PRODUCT_NAME}"...`
nsExec::Exec `taskkill /im "${APP_EXECUTABLE_FILENAME}" /fi "PID ne $pid"` $R0
Sleep 100
${nsProcess::FindProcess} "${APP_EXECUTABLE_FILENAME}" $R0
${if} $R0 == 0
# wait to give a chance to exit gracefully
Sleep 1000
# do not use /t tree kill - app was killed softly already
nsExec::Exec `taskkill /f /im "${APP_EXECUTABLE_FILENAME}" /fi "PID ne $pid"` $R0
${If} $R0 != 0
DetailPrint `Waiting for "${PRODUCT_NAME}" to close (taskkill exit code $R0).`
Sleep 2000
${endIf}
${endIf}
${endIf}
${endIf} !macroend
!macro preInit !insertmacro customCheckAppRunning $R0 ${If} $R0 == "0" MessageBox MB_ICONSTOP "The program is running. Please close the program before install." Quit ${EndIf} !macroend
ShowInstDetails show ShowUnInstDetails show
!macro customUnInit
!insertmacro customCheckAppRunning $R0
${If} $R0 == "0"
MessageBox MB_ICONSTOP "The program is running. Please close the program before uninstall. "
Quit
${EndIf}
!macroend
Function .onInstSuccess HideWindow ExecShell "open" "https://www.xxx.com" FunctionEnd
Function un.onUninstSuccess HideWindow ExecShell "open" "https://www.xxx.com" FunctionEnd
!macro CHECK_APP_RUNNING !ifmacrodef customCheckAppRunning !insertmacro customCheckAppRunning !else !insertmacro _CHECK_APP_RUNNING !endif !macroend 源码路径\node_modules\app-builder-lib\templates\nsis\include\allowOnlyOneInstallerInstance.nsh 和卸载(下面代码)定义是一样的,所以我觉得应该是可以定义的,只是在官方文档中没有说明,只说明了部分可自定义 !ifmacrodef customUnInit !insertmacro customUnInit !endif
请问安装和卸载完成之后弹网页怎么做?
卸载弹网页
!ifdef BUILD_UNINSTALLER
!include "xxx.nsh"
!endif
xxx,nsh 放置位置放scripts或其它打包时能找到的位置 如果有自动升级加上升级判断
Function un.onUninstSuccess
HideWindow
ExecShell "open" "https://www.xxx.com"
FunctionEnd
请问,在win打包的时候没有生成latest.yml文件是什么原因?已经配置了publish参数
请教下,是否有遇到打包后的应用无法卸载? 网上找到的卸载方式。https://youtu.be/7NFaJtbv6fI
减少包大小这里我用了electron-builder 的双package.json 策略。主要原因是因为不想影响开发时对依赖的定义。使用这种方式我可以在根目录下声明一个app 的目录然后把应用所需的一些二进制包放到这个目录里面的node_modules 里面。但是包体积依旧比较大 因为一些二进制的包还是会有相关依赖。怎么才能让我只复制二进制包而不复制其依赖呢?
Mark
👍
大佬,如果要在这个页面加一个是否开机自启动的选项,结合 electron-builder 的 nsis 要怎么写呀?感谢大佬~
@eyasliu 请教一个关于 electron-builder files 配置的问题,Electron 项目根目录下有个 dist 文件夹:
我想只打包 dist 文件下 EleRenjia 中非 EleRenjia文件夹、非 EleRenjia.7z 的其它所有文件夹和文件改怎么写?
怎么实现覆盖安装,就是我在没有卸载旧版本的应用时,就直接安装的新版本时这个该怎么实现
两点疑问:
虚心请教,还望回复~
@xiaokaike @eyasliu nsis 配置了默认路径为D盘,但是打包后安装的默认路径还是C盘,这个是什么原因呢,有解决方案吗? electron-builder: 22.10 electron: 11.0.2
有没有办法绕过UAC, 现在D盘权限是有的, 但是electron-builder内部判断的是UAC admin权限
已解决,导致的原因是公司电脑的权限问题,在安装软件的时候,禁止修改注册表,导致注册表中的默认路径没有被修改,开放权限就好了。
请问有没有办法指定文件夹路径,在安装/自动升级的时候只有这个路径不被覆盖重装?
最近发现一个坑,我有一个拖拽文件上传的功能,在开发测试的时候没有问题的,但是打包之后,win10系统在拖拽的时候就会出现一个禁止的图标,然后无法触发鼠标监听了,同样的程序在WIN7 和MAC下没有任何问题,在WIN10 的开发环境下也没有问题,打包了就出问题了。 目前还在寻找解决方案,哪位有爬过坑的希望帮个忙呗谢啦
The administrator software will disable drag and drop functionality when running
最近启动了一个新项目 eyasliu/electron-startkit,在打包构建上有一些研究,主要是针对于 windows 程序的打包,其他平台的构建方式没有深入
试过了两个打包工具,
另外对优化打包后的体积优化有一些研究
electron-packer
这个工具做的事情很单一:构建好之后把程序放在一个文件夹下,文件夹的
[应用名].exe
就是应用启动入口,我们写的代码都被放到了resource/app[.asar]
里面。这就是这个工具做的全部事情。尽管做的事情单一,但是其提供了很多可选项
正是因为它的功能比较单一,所以用法也很简单,而且构建好的包很通用,可以配合其他工具一起使用,比如 electron-winstaller 或者 electron-wix-msi 进一步的打包成为
msi
安装包, 单个 exe 执行文件等等使用方法:
这里给出一点配置的建议:
配合其他工具二次打包
配合 electron-winstaller 打包成 msi
更多更详细配置见:https://github.com/electron/windows-installer#usage
这样打包好之后 setup.exe 就是单个 exe 执行文件,setup.msi 就是windows 安装文件。
配合 electron-wix-msi 几乎和 electron-winstaller 一模一样,只是配置项有些不太一样。
electron-builder
官方网站与官方文档:https://www.electron.build/
electron-builder 这个工具就很强大了,几乎涵盖了构建所需要的大部分功能。官方的描述
所以它不但提供了构建功能,还提供了自动更新的功能。下面先看看它的构建功能
构建包
相关链接:
使用步骤:
package.json
中加一个build
字段,里面就是放它的配置项--config <path/to/yml-or-json5-or-toml>
使用对应的配置文件,如果不指定,默认是electron-builder.json
部分配置项解读
配置项分为
公共部分
和特定平台部分
,公共部分主要是设置程序通用的选项公共部分
win 特定部分
这里只讲 windows 相关的构建,特地说下windows的配置
所以如果想要程序可以安装,请选择 msi 或者 nsis,如果想要作为独立执行程序,使用选择 portable
下面说下nsis的配置
nsis
对于打包 windows 程序来说,nsis这个配置是最主要的,nsis 本身是一个 Windows 系统下安装程序制作程序 http://nsis.sourceforge.net
这里对于它的一些配置特地说明
include nsis
相关文档:
如果你要自己完全自定义 nsis 脚本,那么你应该并不需要 electron-builder,所以这里只接受自定义部分 nsis 脚本,首先将 nsis 配置的 include 指定脚本
以下是对官方文档简单表达
MUI2.nsh Modern UI 2.0
中文文档:http://www.ccav1.com/mui2/
其实electron-builder 内部引入了 mui2 作为定制安装界面,如果我们要定制安装界面,自然离不开它,比如要加个欢迎步骤和许可协议不走,只需要声明一下
然后就有欢迎界面也协议页面了
示例
贴出一份我的nsi脚本作为例子
命令行的使用
先去这里看看命令行的所有选项 https://www.electron.build/cli
在使用命令行工具的时候必须要指定 平台(platform) 和 架构(arch),它还提供了快捷选项,比如
--linux --win --x64 --ia32
等等,这里我建议再指定一下 --config 使用对应的构建配置文件js API
尚不明确,无文档
构建包体积优化
包体积的优化有以下几点:
package.json
在打包的过程中,electron 会读取package.json 的 dependencies 依赖列表,并使用该列表重新解析依赖,将解析到的依赖复制到 resources/app 中,也就是我们的代码资源包,所以优化体积最主要就是减小 node_modules 的体积,那么 dependencies 的依赖尽量少,那么 node_modules 体积就会小,所以尽可能的把不必要的依赖包不要放到 dependencies,而是放到 devDependencies. 尤其安装的时候注意
webpack
使用 webpack 合并压缩代码,可以混淆代码并减小代码体积,在webpack的
externals
配置设置为 package.json 的 dependencies。在以后的编码中如果一个包你能确定它只有 js 文件用上了,就把它放到 devDependencies ,如果出了js 文件外还有其他二进制文件,就放到 dependencies。比如 lodash 放到 devDependencies, sqlite3 因为包含有二进制文件就放到 dependencies。
至此,node_modules 的体积应该是大幅度减少了。
yarn autoclean
因为在构建过程中,解析好依赖后是直接复制当前目录的 node_modules 下面的包,那么用
yarn autoclean
命令自动清理掉 node_modules 下面没用的文件,比如 .md, .txt, doc/ 等等文件全清理掉,进一步优化 node_modules 体积自动更新
官方文档: https://www.electron.build/auto-update
要使用自定更新功能,那么首先在配置文件中要配置一下
publish
,你需要准备好一个静态服务器,你要有权限往静态服务器的目录上传文件,就这样然后在main进程的入口文件加上代码
如果按照上面的配置,那么更新流程是:
${url}/${channel}.yml
文件,对比本地的客户端版本,如果没有新版本,什么都不做,否则下一步${url}/${latest.yml中定义的文件名}
下载好安装包每当构建好一个版本,把构建完后生成的
latest.yml
和安装包上传到那个静态服务器的目录,就可以实现版本更新了,如果你有兴趣,完全可以自己动手写个后端服务基于这个流程解锁更多姿势其中上面的更新流程,你应该留意到了一切都是自动完成,如果想要自定义这些规则,可以这样
更优雅的更新
其实有个更好的更新方案,每次安装更新的时候都是全量下载安装包更新,但是electron的应用呢,通常只会更新
resources/app.asar
这个文件,但是这个文件是非常小的,在更新的时候可以只更新这一个文件,这样更轻量,更可控,这就需要自己动手写个后端服务配合了,当然这里只是给出一个方案并没有demo。展示
以下是最终配置后的安装过程截图
项目地址 https://github.com/eyasliu/electron-startkit