增量更新包


增量包主要是对electron下面的resources目录下的app.asar文件和app.asar.unpacked文件夹进行替换,其实这样就是整体替换应用程序包,将应用进行整体更新,而外壳的electron框架不进行更新,所以需要针对应用程序app.asar文件和app.asar.unpacked文件夹用打包工具打一个exe安装包。

我们暂时还是介绍NSIS工具来制作增量包,首先需要将应用目录打包成app.asar,同时将忽略的文件和文件夹制作成app.asar.unpacked文件夹,我们将所在的resources文件夹全部进行打包成exe安装包。

  1. electron/resources/
  2. ├── electron.asar
  3. ├── app.asar
  4. └── app.asar.unpacked

在增量包制作过程的脚本中有如下功能点:

OS检测

因为electron只支持windows 7以上的平台,所以安装包脚本能够检测windows 7以下平台,则提示用户退出安装。

  1. ${If} ${AtLeastWin7}
  2. DetailPrint "OS版本为: windows 7+"
  3. ${Else}
  4. MessageBox MB_OK "本程序只能安装在 Windows 7 版本以上的操作系统!"
  5. Abort
  6. ${EndIf}

是否有框架程序

要判断是否存在应用程序,如果没有该exe应用程序,说明从来没有安装过完整包,需要首先安装完整包,才会有增量更新包的安装。

  1. ReadRegStr $R0 HKLM "SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\${EXE_NAME}.exe" "Path"
  2. Strcmp $R0 "" 0 NoAbort
  3. MessageBox MB_ICONEXCLAMATION|MB_OK "未找到程序安装目录,请运行完整安装程序后再运行本更新程序!"
  4. Abort
  5. NoAbort:
  6. DetailPrint "程序已经安装"

静默安装

由于增量更新包用于自动更新,所以采用静默安装的方式来打包。

  1. SetSilent silent

resources目录进行压缩成安装包

首先要读取完整安装包安装时候在注册表写入的exe所在的文件夹路径;然后将应用里面的resources文件夹进行压缩打包成exe,在执行解压的时候就可以直接替换了。

  1. !define APP_DIR "electron\resources"
  2. Section "MainSection" SEC01
  3. SetOverwrite on
  4. ReadRegStr $R0 HKLM "SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\${EXE_NAME}.exe" "Path"
  5. SetOutPath "$R0\resources\"
  6. File /r "${APP_DIR}\*.*"
  7. SectionEnd

附录

更新包打包脚本示例:

  1. ; Titan_app.nsi
  2. !define EXE_NAME "Titan"
  3. !define PRODUCT_VERSION "1.5.1"
  4. !define APP_DIR "electron\resources"
  5. ; MUI 1.67 compatible ------
  6. !include "MUI.nsh"
  7. !include "nsProcess.nsh"
  8. !include "WinVer.nsh"
  9. ; MUI Settings
  10. !define MUI_ABORTWARNING
  11. !define MUI_ICON "logo.ico"
  12. !insertmacro MUI_PAGE_INSTFILES
  13. !define PRODUCT_DIR_REGKEY "Software\Microsoft\Windows\CurrentVersion\App Paths\${EXE_NAME}.exe"
  14. ; MUI end ------
  15. OutFile "${EXE_NAME}_${PRODUCT_VERSION}_app.exe"
  16. Function .onInit
  17. SetSilent silent
  18. ${nsProcess::KillProcess} "${EXE_NAME}.exe" $R2
  19. Sleep 2000
  20. ${If} ${AtLeastWin7}
  21. DetailPrint "OS版本为: windows 7+"
  22. ${Else}
  23. MessageBox MB_OK "本程序只能安装在 Windows 7 版本以上的操作系统!"
  24. Abort
  25. ${EndIf}
  26. ReadRegStr $R0 HKLM "SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\${EXE_NAME}.exe" "Path"
  27. Strcmp $R0 "" 0 NoAbort
  28. MessageBox MB_ICONEXCLAMATION|MB_OK "未找到程序安装目录,请运行完整安装程序后再运行本更新程序!"
  29. Abort
  30. NoAbort:
  31. DetailPrint "程序已经安装"
  32. FunctionEnd
  33. Section "MainSection" SEC01
  34. SetOverwrite on
  35. ReadRegStr $R0 HKLM "SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\${EXE_NAME}.exe" "Path"
  36. SetOutPath "$R0\resources\"
  37. File /r "${APP_DIR}\*.*"
  38. SectionEnd
  39. Function .onInstSuccess
  40. Exec "$R0\${EXE_NAME}.exe"
  41. FunctionEnd

最后用命令行来打包,下面是一条打包的测试命令:

  1. makensis.exe Titan_app.nsi