Files
ykxmz/windows/build_exe.ps1
T
xmz7891 fc61dad0a3 补两个自检失败:build_exe.ps1 丢 BOM + run_agent 用了未导入的 time
全量回归只剩这两项红,都是我这几步引入的:

1. 编码审计:build_exe.ps1 缺 UTF-8 BOM
   我用 edit 工具改它时把 BOM 丢了。PowerShell 5.1 会按 GBK 读,
   里面的中文注释会变乱码。

2. Python 静态检查:run_agent.py:760 undefined name 'time'
   我在 _restart_background 里用了 time.sleep,但 run_agent.py
   模块级没有 import time(原来只有 run_silent 里局部 import)。
   补上之后顺手在注释里记一笔:pyflakes 这一关是有用的。

顺带:test_double_click_window.py 的注释里我原样写了两个
U+FFFD 替换字符当例子,被编码审计当成乱码 —— 改成用文字描述。

现在全量回归 41 个阶段全部通过。
2026-10-07 21:50:00 +08:00

59 lines
2.7 KiB
PowerShell
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.
# 把 Windows 被控端打包成「多文件 EXE」(PyInstaller --onedir)
# 用法: powershell -ExecutionPolicy Bypass -File windows\build_exe.ps1
#
# 产物: dist_exe\ykxmz\
# ├─ ykxmz.exe <- 双击运行
# └─ _internal\ <- 依赖
#
# 刻意使用 --onedir 而不是 --onefile:
# * 启动不解压临时文件,秒开(双击就弹窗口)
# * 依赖可见、可查杀、可替换,方便做安装包
#
# 注意:本版本**不再使用系统托盘**(pystray 已移除),
# 关窗后进程继续运行,靠单实例机制再次双击找回窗口。
$ErrorActionPreference = "Continue"
$windows = $PSScriptRoot # LanRemote/windows
$root = Split-Path -Parent $windows # LanRemote
Write-Host "=== 1/3 生成图标 ===" -ForegroundColor Cyan
& python (Join-Path $root "_build\make_ico.py")
if ($LASTEXITCODE -ne 0) { throw "生成图标失败" }
$ico = Join-Path $windows "app.ico"
Write-Host "`n=== 2/3 PyInstaller 打包(--onedir 多文件)===" -ForegroundColor Cyan
# ⚠ lanremote.ui 必须显式 --hidden-import(见下面那行)。
# 它是"设置窗口"(tkinter)的实现,而静默那条路不需要它,
# PyInstaller 静态分析就找不到 —— 于是双击 exe 想弹设置窗口时
# 会 ModuleNotFoundError: No module named 'lanremote.ui',
# 进程直接退出,用户看到的就是"双击没反应"。
# (PS 的续行符 ` 后面不能再跟 # 注释,所以说明写在这里。)
& python -m PyInstaller --noconfirm --clean --onedir --windowed `
--name "ykxmz" `
--icon "$ico" `
--paths "$windows" `
--hidden-import "PIL._tkinter_finder" `
--hidden-import "lanremote.netcheck" `
--hidden-import "lanremote.features" `
--hidden-import "lanremote.headless" `
--hidden-import "lanremote.ui" `
--version-file (Join-Path $windows "version_info.txt") `
--noupx `
--exclude-module "pystray" `
--exclude-module "numpy" `
--exclude-module "psutil" `
--distpath (Join-Path $root "dist_exe") `
--workpath (Join-Path $root "_build\pyinstaller_work") `
--specpath (Join-Path $root "_build") `
(Join-Path $windows "run_agent.py") 2>&1 | Select-Object -Last 4
$target = Join-Path $root "dist_exe\ykxmz\ykxmz.exe"
if (-not (Test-Path $target)) { throw "打包失败:未生成 $target" }
Write-Host "`n=== 3/3 产物 ===" -ForegroundColor Cyan
Write-Host "目录: $(Split-Path -Parent $target)"
Write-Host ("exe : {0:N1} MB" -f ((Get-Item $target).Length / 1MB))
$all = Get-ChildItem (Split-Path -Parent $target) -Recurse -File
Write-Host ("总计: {0} 个文件, {1:N1} MB" -f $all.Count, (($all | Measure-Object Length -Sum).Sum / 1MB))
Write-Host "`n完成" -ForegroundColor Green