做安装包版本

This commit is contained in:
2026-04-07 23:21:58 +08:00
parent d583e711f0
commit 920d142d9c
11 changed files with 669 additions and 42 deletions
+42
View File
@@ -0,0 +1,42 @@
from __future__ import annotations
import os
import re
from pathlib import Path
ROOT = Path(__file__).resolve().parents[1]
APP_INFO = ROOT / "app_info.py"
ISS_TEMPLATE = ROOT / "installer" / "niumasoftware.iss"
ISS_OUT = ROOT / "installer" / "niumasoftware.generated.iss"
def read_version() -> str:
text = APP_INFO.read_text(encoding="utf-8")
m = re.search(r"""__VERSION__\s*=\s*["']([^"']+)["']""", text)
if not m:
raise RuntimeError("未在 app_info.py 中找到 __VERSION__")
return m.group(1).strip()
def generate_iss(version: str) -> str:
tpl = ISS_TEMPLATE.read_text(encoding="utf-8")
if "{#AppVersion}" not in tpl:
raise RuntimeError("niumasoftware.iss 未包含 {#AppVersion} 占位符")
header = f'#define AppVersion "{version}"\n'
# 如果模板里已经有 #define,则保留并在最前面插入(避免影响原结构)
return header + tpl
def main() -> int:
version = read_version()
out_text = generate_iss(version)
ISS_OUT.write_text(out_text, encoding="utf-8", newline="\n")
print(f"generated: {ISS_OUT}")
print(f"version: {version}")
return 0
if __name__ == "__main__":
raise SystemExit(main())
+77
View File
@@ -0,0 +1,77 @@
#define AppVersion "0.0.3"
; Inno Setup 安装脚本(全局安装)
; 产物约定(统一放在 dist\niumasoftware 下):
; - dist\niumasoftware\niumasoftware.exe (主程序,PyInstaller onedir
; - dist\niumasoftware\update_helper.exe (更新助手,PyInstaller onefile
;
; 安装时会创建一个“按需运行”的计划任务(最高权限)用于静默覆盖更新:
; CleanDesktopOrganizer\Update
;
; 同时创建 ProgramData 目录并赋予 Users Modify 权限,主程序把下载与请求文件写进去:
; {commonappdata}\CleanDesktopOrganizer\
[Setup]
AppName=牛马软件柜
; 由 build_installer.py 生成时注入(不要手改)
AppVersion={#AppVersion}
; 安装包自身图标
SetupIconFile=..\logo.ico
DefaultDirName={autopf}\牛马软件柜
DefaultGroupName=牛马软件柜
OutputBaseFilename=牛马软件柜安装包_{#AppVersion}
Compression=lzma2
SolidCompression=yes
PrivilegesRequired=admin
ArchitecturesAllowed=x64
ArchitecturesInstallIn64BitMode=x64
DisableProgramGroupPage=yes
UninstallDisplayIcon={app}\niumasoftware.exe
[Tasks]
Name: desktopicon; Description: "创建桌面快捷方式"; GroupDescription: "附加图标:"; Flags: unchecked
[Dirs]
; ProgramData:给普通用户写入下载包与请求文件(更新计划任务读取)
Name: "{commonappdata}\CleanDesktopOrganizer"; Permissions: users-modify
Name: "{commonappdata}\CleanDesktopOrganizer\updates"; Permissions: users-modify
[Files]
; PyInstaller onedir:直接复制整个目录(包含 _internal、dll、资源等)
Source: "..\dist\niumasoftware\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs
; 更新助手:PyInstaller onefile 也输出到 dist\niumasoftware 目录
Source: "..\dist\niumasoftware\update_helper.exe"; DestDir: "{app}"; Flags: ignoreversion
[Icons]
Name: "{group}\牛马软件柜"; Filename: "{app}\niumasoftware.exe"; IconFilename: "{app}\niumasoftware.exe"
Name: "{autodesktop}\牛马软件柜"; Filename: "{app}\niumasoftware.exe"; Tasks: desktopicon; IconFilename: "{app}\niumasoftware.exe"
[Run]
Filename: "{app}\niumasoftware.exe"; Description: "运行 牛马软件柜"; Flags: nowait postinstall skipifsilent
[UninstallRun]
Filename: "{sys}\schtasks.exe"; Parameters: "/Delete /TN ""CleanDesktopOrganizer\Update"" /F"; Flags: runhidden
[Code]
procedure CreateUpdateTask();
var
ResultCode: Integer;
Cmd: string;
begin
// 计划任务:以 SYSTEM 运行,按需触发(/SC ONDEMAND
// 注意:TR 不带参数,update_helper.exe 会读取 ProgramData 请求文件
Cmd :=
'/Create /F /TN "CleanDesktopOrganizer\Update" ' +
'/RU "SYSTEM" /RL HIGHEST /SC ONDEMAND ' +
'/TR "' + ExpandConstant('{app}\update_helper.exe') + '"';
Exec(ExpandConstant('{sys}\schtasks.exe'), Cmd, '', SW_HIDE, ewWaitUntilTerminated, ResultCode);
end;
procedure CurStepChanged(CurStep: TSetupStep);
begin
if CurStep = ssPostInstall then
begin
CreateUpdateTask();
end;
end;
+76
View File
@@ -0,0 +1,76 @@
; Inno Setup 安装脚本(全局安装)
; 产物约定(统一放在 dist\niumasoftware 下):
; - dist\niumasoftware\niumasoftware.exe (主程序,PyInstaller onedir
; - dist\niumasoftware\update_helper.exe (更新助手,PyInstaller onefile
;
; 安装时会创建一个“按需运行”的计划任务(最高权限)用于静默覆盖更新:
; CleanDesktopOrganizer\Update
;
; 同时创建 ProgramData 目录并赋予 Users Modify 权限,主程序把下载与请求文件写进去:
; {commonappdata}\CleanDesktopOrganizer\
[Setup]
AppName=牛马软件柜
; 由 build_installer.py 生成时注入(不要手改)
AppVersion={#AppVersion}
; 安装包自身图标
SetupIconFile=..\logo.ico
DefaultDirName={autopf}\牛马软件柜
DefaultGroupName=牛马软件柜
OutputBaseFilename=牛马软件柜安装包_{#AppVersion}
Compression=lzma2
SolidCompression=yes
PrivilegesRequired=admin
ArchitecturesAllowed=x64
ArchitecturesInstallIn64BitMode=x64
DisableProgramGroupPage=yes
UninstallDisplayIcon={app}\niumasoftware.exe
[Tasks]
Name: desktopicon; Description: "创建桌面快捷方式"; GroupDescription: "附加图标:"; Flags: unchecked
[Dirs]
; ProgramData:给普通用户写入下载包与请求文件(更新计划任务读取)
Name: "{commonappdata}\CleanDesktopOrganizer"; Permissions: users-modify
Name: "{commonappdata}\CleanDesktopOrganizer\updates"; Permissions: users-modify
[Files]
; PyInstaller onedir:直接复制整个目录(包含 _internal、dll、资源等)
Source: "..\dist\niumasoftware\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs
; 更新助手:PyInstaller onefile 也输出到 dist\niumasoftware 目录
Source: "..\dist\niumasoftware\update_helper.exe"; DestDir: "{app}"; Flags: ignoreversion
[Icons]
Name: "{group}\牛马软件柜"; Filename: "{app}\niumasoftware.exe"; IconFilename: "{app}\niumasoftware.exe"
Name: "{autodesktop}\牛马软件柜"; Filename: "{app}\niumasoftware.exe"; Tasks: desktopicon; IconFilename: "{app}\niumasoftware.exe"
[Run]
Filename: "{app}\niumasoftware.exe"; Description: "运行 牛马软件柜"; Flags: nowait postinstall skipifsilent
[UninstallRun]
Filename: "{sys}\schtasks.exe"; Parameters: "/Delete /TN ""CleanDesktopOrganizer\Update"" /F"; Flags: runhidden
[Code]
procedure CreateUpdateTask();
var
ResultCode: Integer;
Cmd: string;
begin
// 计划任务:以 SYSTEM 运行,按需触发(/SC ONDEMAND
// 注意:TR 不带参数,update_helper.exe 会读取 ProgramData 请求文件
Cmd :=
'/Create /F /TN "CleanDesktopOrganizer\Update" ' +
'/RU "SYSTEM" /RL HIGHEST /SC ONDEMAND ' +
'/TR "' + ExpandConstant('{app}\update_helper.exe') + '"';
Exec(ExpandConstant('{sys}\schtasks.exe'), Cmd, '', SW_HIDE, ewWaitUntilTerminated, ResultCode);
end;
procedure CurStepChanged(CurStep: TSetupStep);
begin
if CurStep = ssPostInstall then
begin
CreateUpdateTask();
end;
end;