Files
OpenMesh/.trae/rules/打包.md
zhaolei 3e356b117a
Some checks failed
CI / pytest (push) Has been cancelled
CI / gui-unit (push) Has been cancelled
CI / gui-e2e (push) Has been cancelled
```
feat(agent): 添加技能自动路由功能
- 引入 SkillRouter 实现根据用户消息自动推荐技能
- 在构建引擎时集成技能路由器
- 从对话历史中提取最后一条用户消息作为路由输入
- 为技能添加触发关键词和中文标题字段支持

refactor(browser): 重构浏览器自动化为子进程架构

- 将 Playwright 浏览器控制移至独立的子进程 worker
- 解决 PyInstaller 打包环境下 C 扩展兼容性问题
- 通过 JSON RPC 协议与浏览器 worker 通信
- 添加工具目录和脚本路径查找机制

feat(skills): 增强技能元数据和UI展示

- 为技能添加 triggers 和 title 字段
- 在技能商店中包含中文标题信息
- 添加 office-viz 技能优先级排序
- 在服务器管理器中返回技能标题

feat(gui): 实现技能选择器UI组件

- 添加带下拉菜单的技能选择器按钮
- 支持中文标题和拼音首字母显示
- 集成会话技能加载和状态管理
- 提供通用技能选项和已启用技能列表
```
2026-09-14 17:36:02 +08:00

9.0 KiB
Raw Blame History

# OpenMesh 打包流程说明

## 概述

OpenMesh 是一个基于 Python (FastAPI) + React (Vite) 的 AI 智能助手平台,最终交付形态为 Windows 绿色免安装版。打包产物位于 `dist/openmesh/` 目录,用户双击 `启动 OpenMesh.bat` 即可运行。

***

## 打包产物目录结构

```

dist/openmesh/

├── openmesh-server.exe # 后端服务主程序PyInstaller one-dir 模式)

├── openmesh-static.exe # 前端静态文件服务器

├── _internal/ # PyInstaller 运行时依赖Python 解释器 + 所有库)

├── frontend/ # 前端构建产物React + Vite

│ ├── index.html

│ └── assets/

├── data/ # 用户数据目录(首次启动后生成配置)

│ ├── config.toml

│ ├── coworker.db

│ ├── chat.db

│ └── skills/ # 已安装的 skills从 skills/ 初始化复制)

├── skills/ # 预置内置 skills首次启动复制到 data/skills

├── workspace/ # 默认工作目录

├── tools/ # 第三方命令行工具pandoc, tesseract, libreoffice

├── .venv/ # Python 虚拟环境(用于 skill 脚本执行)

├── 启动 OpenMesh.bat # 一键启动脚本

├── 卸载 OpenMesh.bat # 卸载脚本

└── 使用说明.txt # 使用说明

```

***

## 打包步骤总览

完整打包分为 **4 个阶段**,顺序执行:

```

阶段1: 前端构建 → 阶段2: 后端 PyInstaller 打包 → 阶段3: 静态服务器打包 → 阶段4: 组装发布包

```

***

## 阶段 1前端构建

### 目的

将 React + Vite 前端项目编译为静态 HTML/CSS/JS 资源。

### 前置条件

* Node.js >\= 16

* 已执行 `npm install`

### 操作命令

```bash

cd surfaces/gui

npm run build

```

### 输入

* `surfaces/gui/src/` — 前端源码

* `surfaces/gui/index.html` — HTML 模板

### 输出

* `surfaces/gui/dist/` — 构建产物

* `index.html`

* `assets/index-*.js`

* `assets/index-*.css`

* 其他静态资源(字体、图片等)

### 配置文件

* `surfaces/gui/vite.config.ts` — Vite 配置

* `base: "./"` — 相对路径,支持从文件系统直接加载

* 构建输出到 `dist/`

***

## 阶段 2后端服务 PyInstaller 打包

### 目的

将 Python 后端服务FastAPI + uvicorn打包为独立的 Windows 可执行程序及运行时目录。

### 前置条件

* Python 3.10+

* 虚拟环境已安装所有依赖:`pip install -e .`

* `pyinstaller` 已安装

### 操作命令

```bash

pyinstaller dist/openworker-server.spec

```

### Spec 文件说明

路径:`dist/openworker-server.spec`

关键配置:

* **入口**`packaging/server_entry.py` → 调用 `coworker.server.run:main`

* **模式**one-direxe + `_internal/` 目录),比 onefile 启动快 6-7 秒

* **控制台**`console=True`uvicorn 需要 stdout窗口通过 CREATE\_NO\_WINDOW 隐藏)

* **收集的包**coworker, aisuite, mcp, ddgs, uvicorn, certifi, websockets, pypdf, pypdfium2, boto3, botocore 等

* **排除**tkinter, matplotlib, PIL, PyQt5 等不需要的库

### 输出

* `dist/openmesh-server/`

* `openmesh-server.exe` — 主程序

* `_internal/` — Python 运行时 + 所有依赖库

***

## 阶段 3静态文件服务器打包

### 目的

打包一个极简的 HTTP 服务器,用于托管前端静态文件。

### Spec 文件

路径:`openmesh-static.spec` 或 `static-server.spec`

入口:`packaging/static_server.py`

输出:`dist/openmesh-static.exe` 或 `dist/static-server/static-server.exe`

***

## 阶段 4组装发布包

### 目的

将前端、后端、工具、配置等所有组件组装到 `dist/openmesh/` 目录,形成最终可交付的绿色版。

### 组装清单

| 源位置 | 目标位置 | 说明 |

| ------------------------------------------ | ----------------------------------- | ---------- |

| `dist/openmesh-server/openmesh-server.exe` | `dist/openmesh/openmesh-server.exe` | 后端服务 |

| `dist/openmesh-server/_internal/` | `dist/openmesh/_internal/` | Python 运行时 |

| `surfaces/gui/dist/` | `dist/openmesh/frontend/` | 前端构建产物 |

| `dist/openmesh-static.exe` | `dist/openmesh/openmesh-static.exe` | 静态文件服务器 |

| `skills/` (项目内置) | `dist/openmesh/skills/` | 预置 skills |

| `tools/` (pandoc 等) | `dist/openmesh/tools/` | 第三方工具 |

| `dist/config.template.toml` | `dist/openmesh/data/config.toml` | 默认配置 |

| — | `dist/openmesh/workspace/` | 工作目录(空) |

| — | `dist/openmesh/data/` | 数据目录(空) |

| `启动 OpenMesh.bat` | `dist/openmesh/启动 OpenMesh.bat` | 启动脚本 |

| `卸载 OpenMesh.bat` | `dist/openmesh/卸载 OpenMesh.bat` | 卸载脚本 |

| `使用说明.txt` | `dist/openmesh/使用说明.txt` | 使用说明 |

### 启动脚本逻辑

文件:`dist/openmesh/启动 OpenMesh.bat`

关键环境变量:

```bat

set DATA_DIR=%SCRIPT_DIR%data :: COWORKER_STATE_DIR 指向 data 目录

set SKILLS_DIR=%DATA_DIR%\skills :: 实际 skills 目录

set BUILTIN_SKILLS=%SCRIPT_DIR%skills :: 内置 skills 源

set COWORKER_DISABLE_AUTH=1 :: 禁用认证(本地使用)

set COWORKER_STATE_DIR=%DATA_DIR% :: 状态目录

set COWORKER_SCRATCH_BASE=workspace :: 临时文件基准目录

```

启动顺序:

1. 创建 data、skills、workspace 目录

2. 首次启动时,将内置 skills 复制到 data/skills

3. 启动 `openmesh-server.exe --port 8765 --cwd workspace`(后端,端口 8765

4. 启动 `openmesh-static.exe frontend`(前端静态服务器,端口 3000

5. 打开浏览器访问 http://localhost:3000

***

## 重新打包操作清单

当代码修改后需要重新打包时,按以下顺序执行:

### 仅前端修改

```

npm run build → 复制到 dist/openmesh/frontend/

```

### 仅后端修改

```

pyinstaller dist/openworker-server.spec → 复制 exe 和 _internal/ 到 dist/openmesh/

```

### 前后端都修改

```

1. cd surfaces/gui && npm run build

2. pyinstaller dist/openworker-server.spec

3. 组装到 dist/openmesh/

```

***

## 注意事项

1. **data/skills 与 skills/**:内置 skills 仅首次启动时复制。修改内置 skills 后,需删除用户 `data/skills/` 目录才能生效,或手动更新。

2. **PyInstaller 增量构建**build 目录会缓存,重复构建时速度较快。完全干净构建可删除 `build/` 目录。

3. **.venv 目录**:发布包中的 `.venv` 用于 skill 脚本执行(如 Python 脚本),与 PyInstaller 打包的运行时是两套独立环境。

4. **端口冲突**:默认后端 8765前端 3000。可在 `data/config.toml` 中修改。

5. **UPX 压缩**server 端默认关闭 UPX`upx=False`避免某些库加载失败。static 端开启了 UPX。

***

## 相关文件索引

| 文件 | 作用 |

| ------------------------------- | -------------------- |

| `pyproject.toml` | Python 项目配置、依赖、入口点 |

| `dist/openworker-server.spec` | 后端 PyInstaller 配置 |

| `openmesh-static.spec` | 静态服务器 PyInstaller 配置 |

| `dist/server_entry.py` | 后端打包入口 |

| `surfaces/gui/vite.config.ts` | 前端构建配置 |

| `surfaces/gui/package.json` | 前端依赖和脚本 |

| `dist/openmesh/启动 OpenMesh.bat` | 启动脚本 |

| `coworker/server/run.py` | 后端服务主入口 |