fix(ci): 修复 macOS 构建两个失败点 (venv 发现 + 缺图标)

macOS 构建在 macos-26 runner 上失败, 两个独立问题, 均已本地验证通过:

1. uv pip install --project backend 报 'No virtual environment found'
   macos-26 runner 上 --project 的 venv 自动发现不可靠。改为
   working-directory: backend, 与 uv sync 步骤一致。

2. spec 打包时找不到 packaging/icon.icns
   icon.ico 已入库 (Windows 用), 但 icon.icns 未入库 (macOS 专用产物)。
   release.yml 此前无生成图标步骤, macOS 构建必然缺图标而崩。
   新增 '生成 macOS 图标' 步骤 (仅 macos), 用 backend venv 里的 Pillow
   (传递依赖) 跑 generate_icon.py 现场生成。

3. 打包步骤改为 backend cwd 执行, 用 --distpath/--workpath 显式指定
   产物输出到项目根 dist/, 与后续 DMG 步骤路径保持一致。

本地完整验证 (生成图标 + pyinstaller) 成功产出 dist/TickFlowStockPanel.app。
This commit is contained in:
shy3130
2026-06-24 15:10:10 +08:00
parent 5041c6f66d
commit 212ddce7e2
+20 -5
View File
@@ -105,13 +105,28 @@ jobs:
- name: 安装 PyInstaller
# 必须装进 backend 的 uv 环境 (pywebview/polars 等依赖都在那里),
# 否则根目录 uv run 找不到依赖, 打包出来的产物启动即崩。
# --project backend 让 uv 定位 backend/pyproject.toml 的环境。
run: uv pip install --project backend pyinstaller
# 注意: 不用 `uv pip install --project backend` —— 在 macos runner 上
# --project 的 venv 自动发现不可靠 (报 "No virtual environment found")。
# 用 working-directory 进 backend 目录, 与上面 uv sync 的环境一致。
working-directory: backend
run: uv pip install pyinstaller
- name: 生成 macOS 图标 (仅 macOS)
if: matrix.platform == 'macos'
# icon.ico 已入库 (Windows 直接用), 但 icon.icns 未入库 (macOS 专用产物)。
# 用 backend venv 里的 Pillow (fastexcel/pandas 传递依赖, 无需额外安装)
# 现场生成 icon.icns, 否则 spec 第 37 行 BUNDLE 会因找不到图标而崩。
working-directory: backend
run: uv run python ../packaging/generate_icon.py
- name: 打包 (PyInstaller)
# 在项目根目录跑 (spec 用 SPECPATH 推导项目根), 但用 backend 的环境。
# 产物 dist/ 生成在工作目录 (项目根) 下。
run: uv run --project backend pyinstaller packaging/tickflow.spec --noconfirm
# 在 backend 目录跑 (用该目录的 venv: pywebview/polars 等), 但产物输出到
# 项目根的 dist/ —— 用 --distpath/--workpath 显式指定, 与后续 DMG 步骤的
# dist/TickFlowStockPanel.app 路径保持一致。
# SPECPATH 由 spec 文件位置决定 (packaging/tickflow.spec → 项目根),
# 与 cwd 无关, 故 frontend/dist、tiers.yaml 等相对路径仍正确。
working-directory: backend
run: uv run pyinstaller ../packaging/tickflow.spec --noconfirm --distpath ../dist --workpath ../build
- name: 安装 Inno Setup (仅 Windows)
if: matrix.platform == 'windows'