Files
Genarrative/apps/ai-game-creator-shell/src-tauri/windows/release-installer-hooks.nsh
T
kdletters 13a15fed5c
Project CI / AI game creator shell Rust crates (push) Successful in 3m5s
Project CI / AI game creator shell Rust lane 2/2 (push) Successful in 4m24s
Project CI / AI game creator shell Rust lane 1/2 (push) Successful in 5m20s
Project CI / Backend tests (push) Successful in 6m42s
Project CI / Frontend tests (push) Successful in 3m2s
Project CI / Native shell tests (push) Successful in 7m16s
Project CI / AI game creator shell web tests (push) Successful in 3m17s
Project CI / Repository checks (push) Successful in 6m25s
修复 AGC 渠道更新互相终止与快捷方式迁移
为 release 与自定义渠道注入独立主程序名,隔离 Windows 更新进程。

新增 release 旧安装目录与快捷方式迁移钩子,保护 dev 历史目录清理。

同步渠道规范、共享决策与排障记录,补充发布脚本回归测试。
2026-10-04 11:45:20 +08:00

83 lines
3.8 KiB
NSIS
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
; AGC release 渠道的 Windows 安装迁移钩子。
;
; release 曾使用「陶泥儿 Release」作为 productName,后来统一为「陶泥儿」。
; Tauri 的 NSIS 更新模式不会为改名后的身份重建快捷方式,也不会自动读取旧身份的安装目录,
; 所以这里把旧安装目录、旧快捷方式迁移到当前 release 身份。
;
; release 渠道同时使用独立的 MAINBINARYNAME(genarrative-ai-game-creator-shell-release),
; NSIS 默认的按文件名查杀逻辑因此不会碰 dev 渠道的主进程。
;
!define AGC_RELEASE_LEGACY_IDENTITY "陶泥儿 Release"
!define AGC_RELEASE_LEGACY_BINARY "genarrative-ai-game-creator-shell"
Var AgcReleaseLegacyInstallDir
Var AgcReleaseMigratedDesktopShortcut
; Tauri 模板会在 Section Install 开头先执行 SetOutPath,再展开 PREINSTALL 宏。
; 此处仍可在复制文件前改写 $INSTDIR,让旧 release 安装原地升级。
!macro NSIS_HOOK_PREINSTALL
StrCpy $AgcReleaseLegacyInstallDir ""
ReadRegStr $R0 SHCTX "Software\Microsoft\Windows\CurrentVersion\Uninstall\${AGC_RELEASE_LEGACY_IDENTITY}" "InstallLocation"
; Tauri 将 InstallLocation 写成带引号的 REG_SZ;去掉包裹引号后再交给 FileExists。
StrCpy $R1 $R0 1
${If} $R1 == '$\"'
StrCpy $R0 $R0 "" 1
StrLen $R1 $R0
IntOp $R1 $R1 - 1
StrCpy $R0 $R0 $R1
${EndIf}
${If} $R0 != ""
${AndIf} ${FileExists} "$R0\${AGC_RELEASE_LEGACY_BINARY}.exe"
StrCpy $AgcReleaseLegacyInstallDir $R0
StrCpy $INSTDIR $R0
${EndIf}
!macroend
!macro NSIS_HOOK_POSTINSTALL
; 更新模式下模板不会重建快捷方式。先把旧名称和旧主程序名指向当前 release。
!insertmacro IsShortcutTarget "$DESKTOP\${AGC_RELEASE_LEGACY_IDENTITY}.lnk" "$INSTDIR\${AGC_RELEASE_LEGACY_BINARY}.exe"
Pop $0
${If} $0 = 1
StrCpy $AgcReleaseMigratedDesktopShortcut 1
!insertmacro UnpinShortcut "$DESKTOP\${AGC_RELEASE_LEGACY_IDENTITY}.lnk"
Delete "$DESKTOP\${AGC_RELEASE_LEGACY_IDENTITY}.lnk"
${EndIf}
!insertmacro IsShortcutTarget "$SMPROGRAMS\${AGC_RELEASE_LEGACY_IDENTITY}.lnk" "$INSTDIR\${AGC_RELEASE_LEGACY_BINARY}.exe"
Pop $0
${If} $0 = 1
!insertmacro UnpinShortcut "$SMPROGRAMS\${AGC_RELEASE_LEGACY_IDENTITY}.lnk"
Delete "$SMPROGRAMS\${AGC_RELEASE_LEGACY_IDENTITY}.lnk"
${EndIf}
; 用户可能早已把快捷方式改成当前名称,但仍指向旧主程序名。
!insertmacro IsShortcutTarget "$DESKTOP\${PRODUCTNAME}.lnk" "$INSTDIR\${AGC_RELEASE_LEGACY_BINARY}.exe"
Pop $0
${If} $0 = 1
!insertmacro SetShortcutTarget "$DESKTOP\${PRODUCTNAME}.lnk" "$INSTDIR\${MAINBINARYNAME}.exe"
${EndIf}
!insertmacro IsShortcutTarget "$SMPROGRAMS\${PRODUCTNAME}.lnk" "$INSTDIR\${AGC_RELEASE_LEGACY_BINARY}.exe"
Pop $0
${If} $0 = 1
!insertmacro SetShortcutTarget "$SMPROGRAMS\${PRODUCTNAME}.lnk" "$INSTDIR\${MAINBINARYNAME}.exe"
${EndIf}
; 开始菜单图标始终存在;桌面图标只在迁移前存在时补建,保持用户选择。
StrCpy $R0 "$INSTDIR\${MAINBINARYNAME}.exe"
${IfNot} ${FileExists} "$SMPROGRAMS\${PRODUCTNAME}.lnk"
CreateShortCut "$SMPROGRAMS\${PRODUCTNAME}.lnk" "$R0"
!insertmacro SetLnkAppUserModelId "$SMPROGRAMS\${PRODUCTNAME}.lnk"
${EndIf}
${If} $AgcReleaseMigratedDesktopShortcut = 1
CreateShortCut "$DESKTOP\${PRODUCTNAME}.lnk" "$R0"
!insertmacro SetLnkAppUserModelId "$DESKTOP\${PRODUCTNAME}.lnk"
${EndIf}
; 新 release 已接管旧安装目录后,删除旧主程序,避免 dev 的迁移钩子把该目录误判为旧 dev。
${If} $AgcReleaseLegacyInstallDir != ""
Delete "$INSTDIR\${AGC_RELEASE_LEGACY_BINARY}.exe"
DeleteRegKey SHCTX "Software\Microsoft\Windows\CurrentVersion\Uninstall\${AGC_RELEASE_LEGACY_IDENTITY}"
DeleteRegKey HKCU "Software\genarrative\${AGC_RELEASE_LEGACY_IDENTITY}"
${EndIf}
!macroend