功能: - Tauri v2 GUI 应用 - 系统托盘支持 - 日志输出到文件 - 带时间戳的版本号 - 前端资源嵌入 修复: - 前端路径使用相对路径 - 移除 devUrl 配置 - 窗口置顶设置
218 lines
6.2 KiB
Bash
Executable File
218 lines
6.2 KiB
Bash
Executable File
#!/bin/bash
|
||
# Windows 交叉编译并打包脚本
|
||
# 编译 impress_asr_input_rust 项目,复制 manifest 文件,并打包成 ZIP
|
||
|
||
set -e
|
||
|
||
PROJECT_DIR="/home/ubuntu/workspace/cherry-studio/enginneer/impress_asr_input_rust"
|
||
cd "$PROJECT_DIR"
|
||
|
||
# 生成时间戳(精确到秒)
|
||
TIMESTAMP=$(date +"%Y%m%d_%H%M%S")
|
||
DIST_DIR="$PROJECT_DIR/dist/windows-x64"
|
||
OUTPUT_ZIP="$PROJECT_DIR/dist/impress-asr-windows-x64-${TIMESTAMP}.zip"
|
||
|
||
echo "=============================================="
|
||
echo " Impress ASR - Windows 构建打包脚本"
|
||
echo " 时间:$(date '+%Y-%m-%d %H:%M:%S')"
|
||
echo "=============================================="
|
||
|
||
# 清理旧的 dist 目录
|
||
echo ""
|
||
echo "[1/6] 清理旧的 dist 目录..."
|
||
rm -rf "$DIST_DIR"
|
||
mkdir -p "$DIST_DIR"
|
||
|
||
# 构建前端
|
||
echo ""
|
||
echo "[2/6] 构建前端..."
|
||
cd "$PROJECT_DIR/web"
|
||
npm run build
|
||
cd "$PROJECT_DIR"
|
||
|
||
# 验证前端构建
|
||
echo ""
|
||
echo "前端构建结果:"
|
||
ls -lh "$PROJECT_DIR/web/dist/"
|
||
|
||
# 编译 Windows GUI 程序
|
||
echo ""
|
||
echo "[3/6] 编译 Windows GUI 程序..."
|
||
cargo xwin build --release --features gui --target x86_64-pc-windows-msvc
|
||
|
||
# 复制必要文件
|
||
echo ""
|
||
echo "[4/6] 复制必要文件到 dist 目录..."
|
||
cp "$PROJECT_DIR/target/x86_64-pc-windows-msvc/release/impress_asr_gui.exe" "$DIST_DIR/"
|
||
cp "$PROJECT_DIR/impress_asr_gui.exe.manifest" "$DIST_DIR/"
|
||
cp "$PROJECT_DIR/target/x86_64-pc-windows-msvc/release/impress_asr.exe" "$DIST_DIR/"
|
||
cp "$PROJECT_DIR/impress_asr.exe.manifest" "$DIST_DIR/"
|
||
cp "$PROJECT_DIR/icons/tray-icon.png" "$DIST_DIR/"
|
||
|
||
# 复制前端文件(cargo xwin 不会自动嵌入前端资源)
|
||
echo "复制前端资源..."
|
||
cp -r "$PROJECT_DIR/web/dist" "$DIST_DIR/"
|
||
|
||
# 创建 README.md
|
||
cat > "$DIST_DIR/README.md" << 'README_EOF'
|
||
# Impress ASR Input Rust - Windows 运行说明
|
||
|
||
## 🚀 快速启动
|
||
|
||
1. **解压文件** - 将所有文件解压到同一目录
|
||
2. **运行程序** - 双击 `impress_asr_gui.exe`
|
||
|
||
## 📋 诊断输出
|
||
|
||
程序启动时会在控制台输出详细的诊断信息:
|
||
|
||
```
|
||
========================================
|
||
Impress ASR - 启动诊断
|
||
========================================
|
||
|
||
[步骤 1/5] 系统信息
|
||
- 操作系统:windows
|
||
- 架构:x86_64
|
||
- 工作目录:C:\Programs\impress-asr
|
||
- 构建模式:Release
|
||
|
||
[步骤 2/5] 初始化日志系统...
|
||
✓ 日志初始化完成
|
||
|
||
[步骤 3/5] 诊断信息
|
||
✓ 诊断信息已记录
|
||
|
||
[步骤 4/5] 启动 Tauri 应用...
|
||
- 创建主窗口...
|
||
- 初始化系统托盘...
|
||
- 加载前端资源...
|
||
✓ Tauri 应用已启动
|
||
|
||
[窗口] 主窗口信息:
|
||
- 可见性:可见 ✓
|
||
- 最小化:否 ✓
|
||
- 焦点:可设置 ✓
|
||
|
||
[运行] 进入事件循环...
|
||
```
|
||
|
||
**如果窗口不显示**,请查看诊断输出中的 `[窗口]` 部分,确认窗口状态。
|
||
|
||
## 📦 文件清单
|
||
|
||
| 文件 | 说明 |
|
||
|------|------|
|
||
| `impress_asr_gui.exe` | GUI 主程序 |
|
||
| `impress_asr_gui.exe.manifest` | **必需**!Windows 控件版本声明 |
|
||
| `impress_asr.exe` | CLI 命令行工具 |
|
||
| `impress_asr.exe.manifest` | **必需**!Windows 控件版本声明 |
|
||
| `tray-icon.png` | 系统托盘图标 |
|
||
|
||
## 🚀 运行方式
|
||
|
||
### GUI 版本(推荐)
|
||
直接双击 `impress_asr_gui.exe` 即可启动。
|
||
|
||
### CLI 版本
|
||
```cmd
|
||
:: 查看帮助
|
||
impress_asr.exe --help
|
||
|
||
:: 录音
|
||
impress_asr.exe record
|
||
|
||
:: 识别音频文件
|
||
impress_asr.exe recognize -i audio.wav
|
||
```
|
||
|
||
## 📋 系统要求
|
||
|
||
- **操作系统**:Windows 7 / 10 / 11 (x64)
|
||
- **WebView2 Runtime**:Windows 11 已预装,Windows 10 可能需要单独安装
|
||
- 下载地址:https://developer.microsoft.com/zh-cn/microsoft-edge/webview2/
|
||
|
||
## ❓ 常见问题
|
||
|
||
### 错误:无法定位程序输入点 TaskDialogIndirect 于动态链接库
|
||
**原因**:缺少 `.manifest` 文件
|
||
|
||
**解决**:确保 `.manifest` 文件与对应的 `.exe` 文件在同一目录,且文件名匹配。
|
||
|
||
### 错误:找不到 MSVCP140.dll 或 VCRUNTIME140.dll
|
||
**原因**:缺少 Visual C++ 运行时
|
||
|
||
**解决**:下载安装 https://aka.ms/vs/17/release/vc_redist.x64.exe
|
||
|
||
### 错误:模型文件不存在
|
||
**解决**:下载 ONNX 模型并放到 `models/` 目录。
|
||
- SenseVoice Small: https://huggingface.co/FunAudioLLM/SenseVoiceSmall/resolve/main/model.onnx
|
||
|
||
### 窗口不显示但托盘图标可见
|
||
1. 查看控制台诊断输出中的 `[窗口]` 部分
|
||
2. 如果显示 `可见性:隐藏 ⚠`,点击托盘图标 → "显示窗口"
|
||
3. 如果程序已崩溃,查看最后的错误信息
|
||
|
||
## 📝 获取帮助
|
||
|
||
如果遇到问题,请将以下信息提供给开发者:
|
||
|
||
1. **完整的控制台输出**(从 "========" 到程序退出)
|
||
2. **操作系统版本**(Windows 7/10/11)
|
||
3. **问题描述**(例如:窗口不显示、程序闪退等)
|
||
|
||
### 日志文件位置
|
||
```
|
||
%LOCALAPPDATA%\impress-asr\logs\
|
||
```
|
||
|
||
---
|
||
**版本**: 0.1.0 | **构建时间**: 见文件名后缀
|
||
README_EOF
|
||
|
||
echo "文件列表:"
|
||
ls -lh "$DIST_DIR/"
|
||
|
||
# 打包成 ZIP
|
||
echo ""
|
||
echo "[5/6] 打包成 ZIP 文件..."
|
||
cd "$DIST_DIR"
|
||
zip -r "$OUTPUT_ZIP" *.exe *.manifest *.png *.md dist/ 2>/dev/null || {
|
||
# 如果没有 zip 命令,使用 Python
|
||
cd "$PROJECT_DIR"
|
||
python3 -c "
|
||
import zipfile
|
||
import os
|
||
dist_dir = '$DIST_DIR'
|
||
output_zip = '$OUTPUT_ZIP'
|
||
with zipfile.ZipFile(output_zip, 'w', zipfile.ZIP_DEFLATED) as zf:
|
||
for f in os.listdir(dist_dir):
|
||
filepath = os.path.join(dist_dir, f)
|
||
if os.path.isfile(filepath):
|
||
zf.write(filepath, f)
|
||
elif os.path.isdir(filepath):
|
||
for root, dirs, files in os.walk(filepath):
|
||
for file in files:
|
||
file_path = os.path.join(root, file)
|
||
arcname = os.path.relpath(file_path, dist_dir)
|
||
zf.write(file_path, arcname)
|
||
print(f'打包完成:{output_zip}')
|
||
"
|
||
}
|
||
|
||
# 显示结果
|
||
echo ""
|
||
echo "[6/6] 构建打包完成!"
|
||
echo "=============================================="
|
||
echo "输出文件:$OUTPUT_ZIP"
|
||
echo "文件大小:$(ls -lh "$OUTPUT_ZIP" | awk '{print $5}')"
|
||
echo "=============================================="
|
||
echo ""
|
||
echo "Windows 运行所需文件清单:"
|
||
echo " - impress_asr_gui.exe (GUI 主程序)"
|
||
echo " - impress_asr_gui.exe.manifest (必需)"
|
||
echo " - impress_asr.exe (CLI 工具)"
|
||
echo " - impress_asr.exe.manifest (必需)"
|
||
echo " - tray-icon.png (托盘图标)"
|
||
echo "=============================================="
|