Todo: 补充nsis集成需要的依赖 并提交uninstall logo的图片资源 并集成
This commit is contained in:
12
config.py
12
config.py
@@ -9,13 +9,13 @@ import json # 用于将令牌保存为 JSON 格式
|
|||||||
|
|
||||||
# 后端服务器配置
|
# 后端服务器配置
|
||||||
# BACKEND_HOST = "192.168.5.233"
|
# BACKEND_HOST = "192.168.5.233"
|
||||||
# BACKEND_HOST = "192.168.5.12"
|
BACKEND_HOST = "192.168.5.12"
|
||||||
BACKEND_HOST = "shuidrop.com"
|
# BACKEND_HOST = "shuidrop.com"
|
||||||
# BACKEND_HOST = "test.shuidrop.com"
|
# BACKEND_HOST = "test.shuidrop.com"
|
||||||
# BACKEND_PORT = "8000"
|
BACKEND_PORT = "8000"
|
||||||
BACKEND_PORT = ""
|
# BACKEND_PORT = ""
|
||||||
# BACKEND_WS_URL = f"ws://{BACKEND_HOST}:{BACKEND_PORT}"
|
BACKEND_WS_URL = f"ws://{BACKEND_HOST}:{BACKEND_PORT}"
|
||||||
BACKEND_WS_URL = f"wss://{BACKEND_HOST}"
|
# BACKEND_WS_URL = f"wss://{BACKEND_HOST}"
|
||||||
|
|
||||||
# WebSocket配置
|
# WebSocket配置
|
||||||
WS_CONNECT_TIMEOUT = 16.0
|
WS_CONNECT_TIMEOUT = 16.0
|
||||||
|
|||||||
@@ -67,42 +67,61 @@ class NSISInstaller:
|
|||||||
# 创建assets目录
|
# 创建assets目录
|
||||||
self.assets_dir.mkdir(exist_ok=True)
|
self.assets_dir.mkdir(exist_ok=True)
|
||||||
|
|
||||||
# 复制图标文件
|
# 准备主程序图标
|
||||||
icon_sources = [
|
icon_sources = [
|
||||||
self.project_root / "static" / "ai_assistant_icon_64.png",
|
self.project_root / "static" / "ai_assistant_icon_64.png",
|
||||||
self.project_root / "static" / "ai_assistant_icon_32.png",
|
self.project_root / "static" / "ai_assistant_icon_32.png",
|
||||||
self.project_root / "static" / "ai_assistant_icon_16.png"
|
self.project_root / "static" / "ai_assistant_icon_16.png"
|
||||||
]
|
]
|
||||||
|
|
||||||
# 寻找可用的图标文件
|
# 准备卸载程序专用图标
|
||||||
|
uninstall_icon_source = self.project_root / "static" / "ai_assistant_icon_uninstall.png"
|
||||||
|
|
||||||
|
# 转换主程序图标
|
||||||
icon_found = False
|
icon_found = False
|
||||||
for icon_source in icon_sources:
|
for icon_source in icon_sources:
|
||||||
if icon_source.exists():
|
if icon_source.exists():
|
||||||
# 如果有PNG图标,我们需要转换为ICO格式
|
|
||||||
# 这里暂时复制PNG,实际项目中建议准备ICO格式图标
|
|
||||||
icon_dest = self.assets_dir / "icon.ico"
|
|
||||||
try:
|
try:
|
||||||
# 尝试使用PIL转换PNG为ICO格式
|
|
||||||
from PIL import Image
|
from PIL import Image
|
||||||
img = Image.open(icon_source)
|
img = Image.open(icon_source)
|
||||||
ico_path = self.assets_dir / "icon.ico"
|
ico_path = self.assets_dir / "icon.ico"
|
||||||
img.save(ico_path, format='ICO', sizes=[(16,16), (32,32), (48,48), (64,64)])
|
img.save(ico_path, format='ICO', sizes=[(16,16), (32,32), (48,48), (64,64)])
|
||||||
print(f"✅ 转换图标: {icon_source.name} -> icon.ico")
|
print(f"✅ 转换主程序图标: {icon_source.name} -> icon.ico")
|
||||||
icon_found = True
|
icon_found = True
|
||||||
break
|
break
|
||||||
except ImportError:
|
except ImportError:
|
||||||
print("⚠️ 未安装PIL库,跳过图标转换")
|
print("⚠️ 未安装PIL库,跳过图标转换")
|
||||||
break
|
break
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
print(f"⚠️ 图标转换失败: {e}")
|
print(f"⚠️ 主程序图标转换失败: {e}")
|
||||||
continue
|
continue
|
||||||
|
|
||||||
|
# 转换卸载程序图标
|
||||||
|
uninstall_icon_found = False
|
||||||
|
if uninstall_icon_source.exists():
|
||||||
|
try:
|
||||||
|
from PIL import Image
|
||||||
|
img = Image.open(uninstall_icon_source)
|
||||||
|
uninstall_ico_path = self.assets_dir / "uninstall_icon.ico"
|
||||||
|
img.save(uninstall_ico_path, format='ICO', sizes=[(16,16), (32,32), (48,48), (64,64)])
|
||||||
|
print(f"✅ 转换卸载程序图标: {uninstall_icon_source.name} -> uninstall_icon.ico")
|
||||||
|
uninstall_icon_found = True
|
||||||
|
except ImportError:
|
||||||
|
print("⚠️ 未安装PIL库,跳过卸载图标转换")
|
||||||
|
except Exception as e:
|
||||||
|
print(f"⚠️ 卸载程序图标转换失败: {e}")
|
||||||
|
else:
|
||||||
|
print("⚠️ 未找到卸载程序专用图标,将使用主程序图标")
|
||||||
|
|
||||||
if not icon_found:
|
if not icon_found:
|
||||||
print("⚠️ 未找到图标文件,将使用默认图标")
|
print("⚠️ 未找到主程序图标文件,将使用默认图标")
|
||||||
|
|
||||||
return icon_found
|
return {
|
||||||
|
'main_icon': icon_found,
|
||||||
|
'uninstall_icon': uninstall_icon_found
|
||||||
|
}
|
||||||
|
|
||||||
def generate_nsis_script(self, has_icon=False):
|
def generate_nsis_script(self, icon_info):
|
||||||
"""生成NSIS安装脚本"""
|
"""生成NSIS安装脚本"""
|
||||||
print("📝 生成NSIS安装脚本...")
|
print("📝 生成NSIS安装脚本...")
|
||||||
|
|
||||||
@@ -131,8 +150,8 @@ InstallDirRegKey HKLM "Software\\${{APP_PUBLISHER}}\\${{APP_NAME_EN}}" "InstallP
|
|||||||
# 界面设置
|
# 界面设置
|
||||||
!include "MUI2.nsh"
|
!include "MUI2.nsh"
|
||||||
!define MUI_ABORTWARNING
|
!define MUI_ABORTWARNING
|
||||||
{f'!define MUI_ICON "assets\\\\icon.ico"' if has_icon else ''}
|
{f'!define MUI_ICON "assets\\\\icon.ico"' if icon_info.get('main_icon', False) else ''}
|
||||||
{f'!define MUI_UNICON "assets\\\\icon.ico"' if has_icon else ''}
|
{f'!define MUI_UNICON "assets\\\\uninstall_icon.ico"' if icon_info.get('uninstall_icon', False) else f'!define MUI_UNICON "assets\\\\icon.ico"' if icon_info.get('main_icon', False) else ''}
|
||||||
|
|
||||||
# 页面配置
|
# 页面配置
|
||||||
!insertmacro MUI_PAGE_WELCOME
|
!insertmacro MUI_PAGE_WELCOME
|
||||||
@@ -168,16 +187,17 @@ Section "MainSection" SEC01
|
|||||||
# 复制所有文件
|
# 复制所有文件
|
||||||
File /r "..\\dist\\MultiPlatformGUI\\*.*"
|
File /r "..\\dist\\MultiPlatformGUI\\*.*"
|
||||||
|
|
||||||
# 复制图标文件到安装目录(如果有的话)
|
# 复制图标文件到安装目录
|
||||||
{f'File "assets\\\\icon.ico"' if has_icon else ''}
|
{f'File "assets\\\\icon.ico"' if icon_info.get('main_icon', False) else ''}
|
||||||
|
{f'File "assets\\\\uninstall_icon.ico"' if icon_info.get('uninstall_icon', False) else ''}
|
||||||
|
|
||||||
# 创建开始菜单快捷方式
|
# 创建开始菜单快捷方式
|
||||||
CreateDirectory "$SMPROGRAMS\\${{APP_NAME}}"
|
CreateDirectory "$SMPROGRAMS\\${{APP_NAME}}"
|
||||||
{f'CreateShortCut "$SMPROGRAMS\\\\${{APP_NAME}}\\\\${{APP_NAME}}.lnk" "$INSTDIR\\\\${{APP_EXE}}" "" "$INSTDIR\\\\icon.ico" 0' if has_icon else 'CreateShortCut "$SMPROGRAMS\\\\${{APP_NAME}}\\\\${{APP_NAME}}.lnk" "$INSTDIR\\\\${{APP_EXE}}"'}
|
{f'CreateShortCut "$SMPROGRAMS\\\\${{APP_NAME}}\\\\${{APP_NAME}}.lnk" "$INSTDIR\\\\${{APP_EXE}}" "" "$INSTDIR\\\\icon.ico" 0' if icon_info.get('main_icon', False) else 'CreateShortCut "$SMPROGRAMS\\\\${{APP_NAME}}\\\\${{APP_NAME}}.lnk" "$INSTDIR\\\\${{APP_EXE}}"'}
|
||||||
{f'CreateShortCut "$SMPROGRAMS\\\\${{APP_NAME}}\\\\卸载${{APP_NAME}}.lnk" "$INSTDIR\\\\uninstall.exe" "" "$INSTDIR\\\\icon.ico" 0' if has_icon else 'CreateShortCut "$SMPROGRAMS\\\\${{APP_NAME}}\\\\卸载${{APP_NAME}}.lnk" "$INSTDIR\\\\uninstall.exe"'}
|
{f'CreateShortCut "$SMPROGRAMS\\\\${{APP_NAME}}\\\\卸载${{APP_NAME}}.lnk" "$INSTDIR\\\\uninstall.exe" "" "$INSTDIR\\\\uninstall_icon.ico" 0' if icon_info.get('uninstall_icon', False) else f'CreateShortCut "$SMPROGRAMS\\\\${{APP_NAME}}\\\\卸载${{APP_NAME}}.lnk" "$INSTDIR\\\\uninstall.exe" "" "$INSTDIR\\\\icon.ico" 0' if icon_info.get('main_icon', False) else 'CreateShortCut "$SMPROGRAMS\\\\${{APP_NAME}}\\\\卸载${{APP_NAME}}.lnk" "$INSTDIR\\\\uninstall.exe"'}
|
||||||
|
|
||||||
# 创建桌面快捷方式
|
# 创建桌面快捷方式
|
||||||
{f'CreateShortCut "$DESKTOP\\\\${{APP_NAME}}.lnk" "$INSTDIR\\\\${{APP_EXE}}" "" "$INSTDIR\\\\icon.ico" 0' if has_icon else 'CreateShortCut "$DESKTOP\\\\${{APP_NAME}}.lnk" "$INSTDIR\\\\${{APP_EXE}}"'}
|
{f'CreateShortCut "$DESKTOP\\\\${{APP_NAME}}.lnk" "$INSTDIR\\\\${{APP_EXE}}" "" "$INSTDIR\\\\icon.ico" 0' if icon_info.get('main_icon', False) else 'CreateShortCut "$DESKTOP\\\\${{APP_NAME}}.lnk" "$INSTDIR\\\\${{APP_EXE}}"'}
|
||||||
|
|
||||||
# 写入注册表
|
# 写入注册表
|
||||||
WriteRegStr HKLM "Software\\${{APP_PUBLISHER}}\\${{APP_NAME_EN}}" "InstallPath" "$INSTDIR"
|
WriteRegStr HKLM "Software\\${{APP_PUBLISHER}}\\${{APP_NAME_EN}}" "InstallPath" "$INSTDIR"
|
||||||
@@ -282,13 +302,13 @@ SectionEnd
|
|||||||
return False
|
return False
|
||||||
|
|
||||||
# 2. 准备资源文件
|
# 2. 准备资源文件
|
||||||
has_icon = self.prepare_assets()
|
icon_info = self.prepare_assets()
|
||||||
|
|
||||||
# 3. 创建许可证文件
|
# 3. 创建许可证文件
|
||||||
self.create_license_file()
|
self.create_license_file()
|
||||||
|
|
||||||
# 4. 生成NSIS脚本
|
# 4. 生成NSIS脚本
|
||||||
installer_name = self.generate_nsis_script(has_icon)
|
installer_name = self.generate_nsis_script(icon_info)
|
||||||
|
|
||||||
# 5. 构建安装包
|
# 5. 构建安装包
|
||||||
if not self.build_installer():
|
if not self.build_installer():
|
||||||
|
|||||||
@@ -56,6 +56,7 @@ def build_with_command():
|
|||||||
'--name=main',
|
'--name=main',
|
||||||
'--onedir', # 相当于 --exclude-binaries
|
'--onedir', # 相当于 --exclude-binaries
|
||||||
'--windowed', # 相当于 -w
|
'--windowed', # 相当于 -w
|
||||||
|
'--icon=static/ai_assistant_icon_64.png', # 添加主程序图标
|
||||||
'--add-data=config.py;.',
|
'--add-data=config.py;.',
|
||||||
'--add-data=exe_file_logger.py;.',
|
'--add-data=exe_file_logger.py;.',
|
||||||
'--add-data=windows_taskbar_fix.py;.',
|
'--add-data=windows_taskbar_fix.py;.',
|
||||||
|
|||||||
Reference in New Issue
Block a user