Compare commits

...

2 Commits

Author SHA1 Message Date
MikiVL
2c649b8c7c 添加 GitHub Actions 自动构建 Windows/macOS 安装包
Some checks failed
Build Windows Installer / build-windows (push) Has been cancelled
构建安装包 / build-windows (push) Has been cancelled
构建安装包 / build-mac (push) Has been cancelled
每次推送 main 分支或手动触发时,分别在
windows-latest 和 macos-latest 上打包 Python 可执行文件
并生成 Electron 安装包,产物上传为 Artifact 保留 30 天。

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-07 11:42:40 +08:00
MikiVL
6b2c87dc18 修复 Windows 编码问题导致生成失败
Windows 默认编码为 GBK,Python stdout 输出含中文的 JSON 时
Node.js 端无法正确解析,导致批量生成操作静默失败。

- python/main.py:启动时强制 stdin/stdout 使用 UTF-8
- templateIpc.js:spawn 传入 PYTHONUTF8=1,改用 Buffer 拼接后 UTF-8 解码

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-07 11:41:55 +08:00
3 changed files with 105 additions and 6 deletions

91
.github/workflows/build.yml vendored Normal file
View File

@ -0,0 +1,91 @@
name: 构建安装包
on:
push:
branches: [main]
workflow_dispatch:
jobs:
build-windows:
runs-on: windows-latest
steps:
- uses: actions/checkout@v4
- name: 安装 Node.js
uses: actions/setup-node@v4
with:
node-version: 20
cache: npm
- name: 安装 Python
uses: actions/setup-python@v5
with:
python-version: "3.11"
- name: 安装 Node 依赖
run: npm ci
- name: 安装 Python 依赖并打包
run: |
cd python
python -m venv .venv
.venv\Scripts\pip install -r requirements.txt pyinstaller
.venv\Scripts\pyinstaller --onefile --name main --distpath dist --workpath build --specpath . --hidden-import xl_parser --hidden-import generator --collect-all openpyxl --collect-all et_xmlfile --collect-all PIL main.py
shell: cmd
- name: 构建 Renderer
run: cd renderer && npx vite build --config vite.config.mjs
- name: 打包 ElectronWindows
run: npx electron-builder --win
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- name: 上传 Windows 安装包
uses: actions/upload-artifact@v4
with:
name: windows-installer
path: dist/*.exe
retention-days: 30
build-mac:
runs-on: macos-latest
steps:
- uses: actions/checkout@v4
- name: 安装 Node.js
uses: actions/setup-node@v4
with:
node-version: 20
cache: npm
- name: 安装 Python
uses: actions/setup-python@v5
with:
python-version: "3.11"
- name: 安装 Node 依赖
run: npm ci
- name: 安装 Python 依赖并打包
run: |
cd python
python3 -m venv .venv
.venv/bin/pip install -r requirements.txt pyinstaller
.venv/bin/pyinstaller --onefile --name main --distpath dist --workpath build --specpath . --hidden-import xl_parser --hidden-import generator --collect-all openpyxl --collect-all et_xmlfile --collect-all PIL main.py
- name: 构建 Renderer
run: cd renderer && npx vite build --config vite.config.mjs
- name: 打包 ElectronmacOS
run: npx electron-builder --mac
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
CSC_IDENTITY_AUTO_DISCOVERY: false
- name: 上传 macOS 安装包
uses: actions/upload-artifact@v4
with:
name: mac-installer
path: dist/*.dmg
retention-days: 30

View File

@ -18,16 +18,19 @@ const PYTHON_BIN = app.isPackaged
function callPython(payload) {
return new Promise((resolve, reject) => {
const isPackaged = app.isPackaged;
// PYTHONUTF8=1 确保 Windows 上 Python 使用 UTF-8 编码
const spawnEnv = { ...process.env, PYTHONUTF8: "1" };
const proc = isPackaged
? spawn(PYTHON_BIN)
: spawn(process.env.PYTHON_PATH || "python3", [PYTHON_BIN]);
? spawn(PYTHON_BIN, [], { env: spawnEnv })
: spawn(process.env.PYTHON_PATH || "python3", [PYTHON_BIN], { env: spawnEnv });
let stdout = "";
proc.stdout.on("data", (d) => (stdout += d));
proc.stderr.on("data", (d) => console.error("[python]", d.toString()));
const chunks = [];
proc.stdout.on("data", (d) => chunks.push(d));
proc.stderr.on("data", (d) => console.error("[python]", d.toString("utf8")));
proc.on("close", () => {
const stdout = Buffer.concat(chunks).toString("utf8").trim();
try {
resolve(JSON.parse(stdout.trim()));
resolve(JSON.parse(stdout));
} catch (e) {
reject(new Error("Python 返回了无效 JSON: " + stdout));
}

View File

@ -1,5 +1,10 @@
import sys
import json
import io
# Windows 默认编码不是 UTF-8强制设置
sys.stdin = io.TextIOWrapper(sys.stdin.buffer, encoding="utf-8")
sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding="utf-8", line_buffering=True)
def main():
for line in sys.stdin: