chore: remove build-release.sh, docs/BUILD.md, release-notes.md, restore-build-cache.sh

This commit is contained in:
thzxx
2026-06-23 20:12:46 +08:00
parent 042e00e4a6
commit 8feffd53cd
4 changed files with 0 additions and 584 deletions
-157
View File
@@ -1,157 +0,0 @@
#!/bin/bash
set -e
PROJECT_DIR="/root/.openclaw/workspace/metona-ollama-desktop"
TOKEN="2faf8da068ae0944f7d40c265d21e651"
REPO="thzxx/metona-ollama-desktop"
VERSION="5.1.4"
LOG_FILE="/root/.openclaw/workspace/metona-ollama-desktop/build-v5.1.4.log"
exec > >(tee -a "$LOG_FILE") 2>&1
echo "══════════════════════════════════════════════"
echo " Metona Ollama Desktop v${VERSION} 构建开始"
echo " $(date '+%Y-%m-%d %H:%M:%S')"
echo "══════════════════════════════════════════════"
cd "$PROJECT_DIR"
# ── Step 1: 检查环境 ──
echo ""
echo "▶ Step 1: 检查构建环境"
echo "──────────────────────"
node --version
npm --version
echo "OS: $(uname -a)"
echo "Wine: $(wine --version 2>/dev/null || echo 'NOT INSTALLED')"
echo "p7zip: $(7z 2>/dev/null | head -1 || echo 'NOT INSTALLED')"
# ── Step 2: 确保在正确分支 ──
echo ""
echo "▶ Step 2: 确认分支"
echo "──────────────────────"
git checkout develop
git log --oneline -1
# ── Step 3: 安装依赖 ──
echo ""
echo "▶ Step 3: npm install"
echo "──────────────────────"
npm config set registry https://registry.npmmirror.com
ELECTRON_MIRROR=https://npmmirror.com/mirrors/electron/ npm install 2>&1
echo "npm install 完成"
# ── Step 4: 构建 ──
echo ""
echo "▶ Step 4: npm run build"
echo "──────────────────────"
npm run build 2>&1
echo "npm run build 完成"
# ── Step 5: 打包 Windows 安装包 ──
echo ""
echo "▶ Step 5: npm run dist (Windows NSIS)"
echo "──────────────────────────────────────"
# 先尝试恢复构建缓存
if [ -f restore-build-cache.sh ]; then
echo "尝试恢复构建缓存..."
bash restore-build-cache.sh 2>&1 || echo "构建缓存恢复失败,electron-builder 将自动下载"
fi
ELECTRON_MIRROR=https://npmmirror.com/mirrors/electron/ npm run dist 2>&1
echo "npm run dist 完成"
# ── Step 6: 检查产物 ──
echo ""
echo "▶ Step 6: 检查构建产物"
echo "────────────────────────"
ls -lh release/*.exe 2>/dev/null || echo "未找到 .exe 文件!"
EXE_FILE=$(ls release/*Setup*.exe 2>/dev/null | head -1)
if [ -z "$EXE_FILE" ]; then
echo "❌ 构建失败:未找到安装包"
exit 1
fi
echo "✅ 安装包: $EXE_FILE ($(du -h "$EXE_FILE" | cut -f1))"
# ── Step 7: Gitee 发布 ──
echo ""
echo "▶ Step 7: Gitee 发布"
echo "──────────────────────"
# 删除旧的 v5.1.4-desktop release(如有)
echo "检查旧 release..."
RELEASES=$(curl -s "https://gitee.com/api/v5/repos/${REPO}/releases?access_token=${TOKEN}&page=1&per_page=50")
OLD_RELEASE_ID=$(echo "$RELEASES" | python3 -c "
import sys, json
try:
releases = json.load(sys.stdin)
for r in releases:
if r.get('tag_name') == 'v${VERSION}-desktop':
print(r['id'])
break
except: pass
" 2>/dev/null)
if [ -n "$OLD_RELEASE_ID" ]; then
echo "删除旧 release ID: $OLD_RELEASE_ID"
curl -s -X DELETE "https://gitee.com/api/v5/repos/${REPO}/releases/${OLD_RELEASE_ID}?access_token=${TOKEN}" > /dev/null
echo "旧 release 已删除"
fi
# 创建新 release
echo "创建 v${VERSION}-desktop release..."
RELEASE_RESPONSE=$(curl -s -X POST "https://gitee.com/api/v5/repos/${REPO}/releases?access_token=${TOKEN}" \
-H "Content-Type: application/json" \
-d "{
\"tag_name\": \"v${VERSION}-desktop\",
\"name\": \"v${VERSION}-desktop\",
\"body\": \"Metona Ollama Desktop v${VERSION}\\n\\n详见 [更新日志](https://gitee.com/thzxx/metona-ollama-desktop/blob/develop/docs/CHANGELOG.md)\",
\"target_commitish\": \"develop\"
}")
RELEASE_ID=$(echo "$RELEASE_RESPONSE" | python3 -c "
import sys, json
try:
r = json.load(sys.stdin)
print(r.get('id', ''))
except: pass
" 2>/dev/null)
if [ -z "$RELEASE_ID" ]; then
echo "❌ 创建 release 失败"
echo "$RELEASE_RESPONSE"
exit 1
fi
echo "✅ Release 创建成功,ID: $RELEASE_ID"
# 上传附件
echo "上传安装包附件..."
UPLOAD_RESPONSE=$(curl -s -X POST "https://gitee.com/api/v5/repos/${REPO}/releases/${RELEASE_ID}/attach_files?access_token=${TOKEN}" \
-H "Content-Type: multipart/form-data" \
-F "file=@${EXE_FILE}")
UPLOAD_SUCCESS=$(echo "$UPLOAD_RESPONSE" | python3 -c "
import sys, json
try:
r = json.load(sys.stdin)
if r.get('browser_download_url'):
print('OK')
else:
print('FAIL: ' + str(r))
except Exception as e:
print('FAIL: ' + str(e))
" 2>/dev/null)
if [ "$UPLOAD_SUCCESS" = "OK" ]; then
echo "✅ 安装包上传成功"
else
echo "❌ 上传失败: $UPLOAD_RESPONSE"
exit 1
fi
echo ""
echo "══════════════════════════════════════════════"
echo " 构建完成!v${VERSION}"
echo " $(date '+%Y-%m-%d %H:%M:%S')"
echo " Release: https://gitee.com/${REPO}/releases"
echo "══════════════════════════════════════════════"
-183
View File
@@ -1,183 +0,0 @@
# Windows 安装包构建指南
## 环境要求
- Ubuntu 24.04 (amd64)
- Node.js v22+
- Wine 9.0+(用于 electron-builder 交叉编译)
- i386 架构已启用(`dpkg --add-architecture i386`
- p7zip-full(解压构建资源)
## 快速构建(3 步)
```bash
# 1. 克隆并安装依赖
git clone https://gitee.com/thzxx/metona-ollama-desktop.git
cd metona-ollama-desktop
npm config set registry https://registry.npmmirror.com
npm install
# 2. 恢复构建缓存(首次从镜像下载,后续使用本地缓存)
bash restore-build-cache.sh
# 3. 构建
ELECTRON_MIRROR=https://npmmirror.com/mirrors/electron/ npm run dist
```
产出文件在 `release/` 目录。
## 构建资源管理
构建需要以下资源(共 ~145MB),通过 `restore-build-cache.sh` 自动管理:
| 资源 | 大小 | 来源 |
|------|------|------|
| Electron v33.4.11 win32-x64 | 110MB | npmmirror |
| NSIS 3.0.4.1 | 7.8MB | GitHub (ghfast.top 代理) |
| NSIS Resources 3.4.1 | 3.0MB | GitHub (ghfast.top 代理) |
| winCodeSign 2.6.0 | 24MB | GitHub (ghfast.top 代理) |
**工作原理**
- 首次运行:从镜像下载 → 自动缓存到 `build-resources/``~/.cache/`
- 后续运行:从 `build-resources/` 复制到 `~/.cache/`(秒级完成)
- `build-resources/``.gitignore` 中,不进 gitElectron 二进制 110MB 超 git 限制)
**自定义镜像**
```bash
GITHUB_PROXY=https://gh-proxy.com/ bash restore-build-cache.sh
```
## 详细步骤
### 1. 安装 Wine
```bash
dpkg --add-architecture i386
apt-get update
apt-get install -y wine wine32 p7zip-full
```
### 2. 安装 npm 依赖
```bash
npm config set registry https://registry.npmmirror.com
npm install
```
### 3. 恢复构建缓存
```bash
bash restore-build-cache.sh
```
首次会从镜像下载约 145MB 资源,后续构建只需秒级恢复。
### 4. 构建 Windows 安装包
```bash
ELECTRON_MIRROR=https://npmmirror.com/mirrors/electron/ npm run dist
```
## 常用命令
```bash
npm start # 开发运行
npm run pack # 仅构建目录(不打包)
npm run dist:nsis # 仅 NSIS 安装包
npm run dist # NSIS 安装包
```
## 构建产物
| 文件 | 说明 |
|------|------|
| `release/Metona Ollama Setup v0.12.2.exe` | NSIS 安装包(可选目录、创建快捷方式) |
> 仅提供 NSIS 安装包。
## 发布到 Gitee
### 创建 Release
```bash
TOKEN="your_access_token"
curl -X POST "https://gitee.com/api/v5/repos/thzxx/metona-ollama-desktop/releases?access_token=$TOKEN" \
-H "Content-Type: application/json" \
-d '{"tag_name":"v0.12.2","name":"v0.12.2","body":"Release notes","target_commitish":"master"}'
```
### 上传附件
```bash
TOKEN="your_access_token"
RELEASE_ID="<release_id>"
curl -X POST "https://gitee.com/api/v5/repos/thzxx/metona-ollama-desktop/releases/$RELEASE_ID/attach_files?access_token=$TOKEN" \
-H "Content-Type: multipart/form-data" -F "file=@release/Metona Ollama Setup v0.12.2.exe"
```
## 故障排查
| 问题 | 解决方案 |
|------|----------|
| apt 源超时(mirrors.cloud.aliyuncs.com 不可达) | `sed -i 's\|mirrors.cloud.aliyuncs.com\|archive.ubuntu.com\|g' /etc/apt/sources.list && apt-get update` |
| npm install 卡住无输出 | 终止后重试 `npm install --prefer-offline`,通常首次已装大部分包,二次秒完成 |
| npmmirror 缺少 Electron 包(restore-build-cache.sh 失败,NoSuchKey | npmmirror 可能未同步特定版本。跳过缓存脚本,直接 `npm run dist`electron-builder 会自动从 npmmirror 下载(`ELECTRON_MIRROR` 环境变量生效) |
| electron-builder 报错 "wine is required" | Wine 是签名步骤的硬依赖,必须安装:`dpkg --add-architecture i386 && apt-get update && apt-get install -y wine wine32` |
| apt 源 i386 架构下载失败 | 先确保主源可用(切 archive.ubuntu.com),再 `apt-get update`,最后装 wine |
| Electron 下载超时 | 设 `ELECTRON_MIRROR=https://npmmirror.com/mirrors/electron/` 或直接用 `npm run dist`electron-builder 自动处理) |
| NSIS/winCodeSign 下载超时 | `GITHUB_PROXY=https://gh-proxy.com/ bash restore-build-cache.sh` |
| winCodeSign 下载 EOF 错误(github.com 连接中断) | 手动下载并缓存(见下方) |
| npm install 时 Electron "socket hang up" | 设置 `ELECTRON_MIRROR=https://npmmirror.com/mirrors/electron/` 后重试 |
| restore-build-cache.sh 因 Electron 失败导致后续缓存全部跳过 | 跳过脚本,手动下载缺失资源(见下方) |
| "symbol already declared" | 检查 TS 文件中的重复 `const`/`let` 声明 |
### 手动下载构建缓存(逐项修复)
`restore-build-cache.sh` 部分失败时,可手动下载缺失资源:
```bash
GITHUB_PROXY="https://ghfast.top/"
GITHUB_ORIG="https://github.com/electron-userland/electron-builder-binaries/releases/download"
CACHE="$HOME/.cache/electron-builder"
# winCodeSign(构建签名步骤硬依赖)
mkdir -p "$CACHE/winCodeSign"
wget -O "/tmp/winCodeSign-2.6.0.7z" \
"${GITHUB_PROXY}${GITHUB_ORIG}/winCodeSign-2.6.0/winCodeSign-2.6.0.7z"
cd "$CACHE/winCodeSign" && 7z x -y "/tmp/winCodeSign-2.6.0.7z" -o"winCodeSign-2.6.0"
# NSIS
mkdir -p "$CACHE/nsis"
wget -O "/tmp/nsis-3.0.4.1.7z" \
"${GITHUB_PROXY}${GITHUB_ORIG}/nsis-3.0.4.1/nsis-3.0.4.1.7z"
cd "$CACHE/nsis" && 7z x -y "/tmp/nsis-3.0.4.1.7z" -o"nsis-3.0.4.1"
# NSIS Resources
wget -O "/tmp/nsis-resources-3.4.1.7z" \
"${GITHUB_PROXY}${GITHUB_ORIG}/nsis-resources-3.4.1/nsis-resources-3.4.1.7z"
cd "$CACHE/nsis" && 7z x -y "/tmp/nsis-resources-3.4.1.7z" -o"nsis-resources-3.4.1"
# 清理临时文件
rm -f /tmp/winCodeSign-2.6.0.7z /tmp/nsis-3.0.4.1.7z /tmp/nsis-resources-3.4.1.7z
```
> Electron 无需手动下载——设置 `ELECTRON_MIRROR` 后 electron-builder 会自动处理。
### ⚠️ 已知问题:npmmirror 与 restore-build-cache.sh 兼容性
`restore-build-cache.sh` 第一步从 npmmirror 下载 Electron zip 时可能遇到 **NoSuchKey** 错误,因为 npmmirror 未同步该版本。此时脚本会因 `set -e` 直接退出,后续 NSIS/winCodeSign 缓存也不会恢复。
**推荐做法**:跳过 `restore-build-cache.sh`,直接执行:
```bash
ELECTRON_MIRROR=https://npmmirror.com/mirrors/electron/ npm run dist
```
electron-builder 会自动处理所有依赖下载(Electron、NSIS、winCodeSign),虽然首次较慢(~5分钟),但无需手动管理缓存。
## 提速清单
| 环节 | 默认 → 加速 | 效果 |
|------|------------|------|
| apt 源 | aliyuncs → archive.ubuntu.com | 稳定 |
| npm | npmjs → npmmirror | ~17s |
| Electron | github → npmmirror | ~3s |
| NSIS/winCodeSign | github → ghfast + 本地缓存 | 秒级 |
-147
View File
@@ -1,147 +0,0 @@
# Metona Ollama Desktop v1.1.0
> 本地 Ollama AI 桌面客户端 — 首个稳定版本
## 项目简介
Metona Ollama Desktop 是一个基于 **Ollama** 的本地 AI 桌面客户端,采用 TypeScript + Electron 构建。所有 AI 推理均在本地完成,数据不离开本机。支持 ReAct Agent Loop、42 个内置工具、智能记忆系统、MCP 协议扩展、四引擎联网搜索、浏览器控制等能力。
---
## 核心功能
### 🤖 ReAct Agent Loop
- Thought → Action → Observation → Reflection 完整循环
- 默认最大 85 轮迭代,支持自动重试(最多 2 次)
- 工具调用去重机制:调用缓存 + 同轮重复检测 + 跨轮次重复检测
- 并行工具调用:互相独立的工具可在同一次回复中同时执行
- 链式工具调用:web_search → web_fetch、list_directory → read_file 等模式
- 文本解析兜底:当模型未通过 tool_calls 返回时,从文本中提取 Action/Input
### 🔧 42 个内置工具
| 分类 | 数量 | 工具 |
|------|------|------|
| 文件系统 | 17 | read_file, write_file, list_directory, search_files, create_directory, delete_file, move_file, copy_file, append_file, edit_file, get_file_info, tree, download_file, diff_files, replace_in_files, read_multiple_files, compress |
| 命令执行 | 1 | run_command(实时流式输出,工作空间终端集成) |
| 联网搜索 | 2 | web_searchBing + 百度 + 搜狗 + 360搜索 四引擎), web_fetch |
| 浏览器控制 | 8 | browser_open, browser_screenshot, browser_evaluate, browser_extract, browser_click, browser_type, browser_scroll, browser_close |
| Git | 1 | gitinit/clone/add/commit/push/pull/diff/log/status/branch/checkout/merge/stash/reset/tag/remote |
| 记忆管理 | 4 | memory_search, memory_add, memory_replace, memory_remove |
| 会话管理 | 2 | session_list, session_read |
| 子代理 | 1 | spawn_task(独立上下文 + 超时保护) |
| 系统工具 | 6 | datetime / calculator / random / uuid / json_format / hash |
### 🧠 智能记忆系统
- **三类记忆**fact(事实)、preference(偏好)、rule(规则,始终注入上下文)
- **双模式检索**:FTS5 全文搜索 + 向量语义搜索(IVF 索引)
- **安全扫描**:写入前检测 prompt injection、敏感信息泄露、不可见 Unicode 字符
- **容量管理**:上限 500 条,超限自动清理低价值条目(rule 类型受保护)
- **过期衰减**:90 天未使用的记忆自动降低 importance
### 🌐 MCP 协议支持
- JSON-RPC 2.0 over stdio 标准协议
- 动态工具发现与执行
- Shadowing 防护(防止 MCP 工具覆盖内置工具名)
- 60 秒请求超时保护
### 🔍 四引擎联网搜索
- Bing + 百度 + 搜狗 + 360搜索 四引擎聚合
- web_search 返回标题、URL、摘要(默认 15 条)
- web_fetch 支持网页内容抓取(默认不截断)
- 工具链规则:搜索后自动引导抓取详情
### 🖥️ 工作空间面板
- 终端(实时流式输出)+ 文件浏览器一体化
- AI 通过 run_command 工具执行命令,输出实时显示
- 命令安全检查:路径黑名单 + 命令黑名单 + 三种执行模式
### 🎨 Token 实时监控仪表盘
- 全局统计(跨会话累计 Token 分析)和当前会话统计双视图
- Token 消耗趋势图(输入/输出分色显示)
- 2 秒自动刷新
### 🔒 安全机制
- 文件路径安全检查(checkPathAllowed
- 命令执行安全检查(checkCommandAllowed
- 前端 HTML 净化器(白名单标签 + 属性过滤 + URI 协议检查)
- contextIsolation: true + IPC 白名单
- AES-256-GCM 加密支持
---
## 技术架构
```
用户消息 → Agent LoopReAct
记忆检索(FTS5 + 向量搜索)→ 上下文注入
Ollama API(流式响应)
工具调用(39 内置 + MCP 动态)
观察结果 → 反思 → 循环/最终回答
```
### 数据层
- **SQLite (sql.js WASM)**6 张表(sessions, messages, tool_calls, memories, settings, traces
- **FTS5 全文搜索**memories 表支持全文检索
- **WAL 模式 + NORMAL 同步**:零原生依赖,无需 electron-rebuild
### 上下文管理(v5.0
- 三层策略:滑动窗口 + LLM 摘要压缩 + 记忆注入
- `/compress` 手动触发上下文压缩
- 自动压缩阈值:消息 token 占 context window 50% 时触发
- Token 估算:中文 1.5 字/token,英文 4 字符/token
### 技术栈
| 层级 | 技术 |
|------|------|
| 语言 | TypeScript (strict mode) |
| 桌面框架 | Electron 33+ |
| 构建 | Vite(渲染进程)+ tsc(主进程) |
| 数据库 | sql.js (WASM) + FTS5 |
| 第三方库 | markedMarkdown, DOMPurifyHTML 净化) |
| 打包 | electron-builder (NSIS) |
---
## 最近改进
- **`/compress` 上下文压缩**:支持手动触发 LLM 摘要压缩,长对话不再丢失上下文
- **Token 全局统计**:仪表盘新增跨会话累计 Token 分析视图
- **图表重写**:Token 消耗趋势图重写 — 网格线 + 正确高度计算 + 柱子底部对齐
- **Agent Loop 稳定性**:修复 abortController 在自动压缩前未定义的严重 bug
- **工具调用修复**:修复工具卡片状态更新、错误信息显示、执行中状态残留等问题
- **消息渲染修复**:修复用户消息不显示、AI 消息时间戳、思考气泡残留等 UI 问题
---
## 系统要求
- **操作系统**Windows 10/1164 位)
- **Ollama**:需要本地运行 Ollama 服务(默认 http://localhost:11434
- **磁盘空间**:安装包约 82MB,运行时根据模型大小需要额外空间
- **内存**:建议 8GB+(取决于使用的 AI 模型)
---
## 安装说明
1. 下载 `Metona Ollama Setup v1.1.0.exe`
2. 运行安装程序,可自定义安装目录
3. 确保本地已安装并运行 [Ollama](https://ollama.com)
4. 启动 Metona Ollama,在设置中配置 Ollama 服务地址
5. 选择模型,开始对话
---
## 已知限制
- 仅支持 Windows x64 平台
- 需要本地运行 Ollama 服务,不支持远程 Ollama 服务器(后续版本考虑支持)
- 浏览器控制工具依赖系统 Chromium,部分 SPA 页面抓取可能不完整
- 向量搜索需要配置嵌入模型(embedding model),未配置时仅支持关键词搜索
- MCP 工具目前仅支持 stdio 传输方式
- 子代理(spawn_task)为独立上下文,无法共享主对话记忆
-97
View File
@@ -1,97 +0,0 @@
#!/bin/bash
# restore-build-cache.sh
# 从 build-resources/ 恢复 electron-builder 缓存,加速构建
# 如果本地资源不存在,自动从镜像下载
set -e
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
CACHE_ELECTRON="$HOME/.cache/electron"
CACHE_BUILDER="$HOME/.cache/electron-builder"
LOCAL="$SCRIPT_DIR/build-resources"
ELECTRON_MIRROR="${ELECTRON_MIRROR:-https://npmmirror.com/mirrors/electron/}"
GITHUB_PROXY="${GITHUB_PROXY:-https://ghfast.top/}"
GITHUB_ORIG="https://github.com/electron-userland/electron-builder-binaries/releases/download"
ELECTRON_VERSION="33.4.11"
NSIS_VERSION="3.0.4.1"
NSIS_RES_VERSION="3.4.1"
WINCODESIGN_VERSION="2.6.0"
echo "===== 恢复构建缓存 ====="
ELECTRON_FILE="electron-v${ELECTRON_VERSION}-win32-x64.zip"
mkdir -p "$CACHE_ELECTRON"
if [ -f "$LOCAL/electron/$ELECTRON_FILE" ]; then
echo "[1/4] Electron ← 本地缓存"
cp "$LOCAL/electron/$ELECTRON_FILE" "$CACHE_ELECTRON/"
elif [ -f "$CACHE_ELECTRON/$ELECTRON_FILE" ]; then
echo "[1/4] Electron ← 缓存已存在"
else
echo "[1/4] Electron ← 下载 ${ELECTRON_MIRROR}${ELECTRON_FILE}"
mkdir -p "$LOCAL/electron"
wget -q --show-progress -O "$CACHE_ELECTRON/$ELECTRON_FILE" "${ELECTRON_MIRROR}${ELECTRON_FILE}"
cp "$CACHE_ELECTRON/$ELECTRON_FILE" "$LOCAL/electron/"
fi
mkdir -p "$CACHE_BUILDER/nsis"
NSIS_DIR="$CACHE_BUILDER/nsis/nsis-${NSIS_VERSION}"
if [ -d "$LOCAL/electron-builder/nsis-${NSIS_VERSION}" ]; then
echo "[2/4] NSIS ${NSIS_VERSION} ← 本地缓存"
cp -r "$LOCAL/electron-builder/nsis-${NSIS_VERSION}" "$NSIS_DIR"
elif [ -d "$NSIS_DIR" ]; then
echo "[2/4] NSIS ${NSIS_VERSION} ← 缓存已存在"
else
echo "[2/4] NSIS ${NSIS_VERSION} ← 下载"
mkdir -p "$LOCAL/electron-builder"
wget -q --show-progress -O "/tmp/nsis-${NSIS_VERSION}.7z" \
"${GITHUB_PROXY}${GITHUB_ORIG}/nsis-${NSIS_VERSION}/nsis-${NSIS_VERSION}.7z"
cd "$CACHE_BUILDER/nsis"
7z x -y "/tmp/nsis-${NSIS_VERSION}.7z" -o"nsis-${NSIS_VERSION}" >/dev/null
rm -f "/tmp/nsis-${NSIS_VERSION}.7z"
cp -r "$NSIS_DIR" "$LOCAL/electron-builder/"
cd "$SCRIPT_DIR"
fi
NSIS_RES_DIR="$CACHE_BUILDER/nsis/nsis-resources-${NSIS_RES_VERSION}"
if [ -d "$LOCAL/electron-builder/nsis-resources-${NSIS_RES_VERSION}" ]; then
echo "[3/4] NSIS Resources ${NSIS_RES_VERSION} ← 本地缓存"
cp -r "$LOCAL/electron-builder/nsis-resources-${NSIS_RES_VERSION}" "$NSIS_RES_DIR"
elif [ -d "$NSIS_RES_DIR" ]; then
echo "[3/4] NSIS Resources ${NSIS_RES_VERSION} ← 缓存已存在"
else
echo "[3/4] NSIS Resources ${NSIS_RES_VERSION} ← 下载"
mkdir -p "$LOCAL/electron-builder"
wget -q --show-progress -O "/tmp/nsis-resources-${NSIS_RES_VERSION}.7z" \
"${GITHUB_PROXY}${GITHUB_ORIG}/nsis-resources-${NSIS_RES_VERSION}/nsis-resources-${NSIS_RES_VERSION}.7z"
cd "$CACHE_BUILDER/nsis"
7z x -y "/tmp/nsis-resources-${NSIS_RES_VERSION}.7z" -o"nsis-resources-${NSIS_RES_VERSION}" >/dev/null
rm -f "/tmp/nsis-resources-${NSIS_RES_VERSION}.7z"
cp -r "$NSIS_RES_DIR" "$LOCAL/electron-builder/"
cd "$SCRIPT_DIR"
fi
WINCS_DIR="$CACHE_BUILDER/winCodeSign/winCodeSign-${WINCODESIGN_VERSION}"
if [ -d "$LOCAL/electron-builder/winCodeSign-${WINCODESIGN_VERSION}" ]; then
echo "[4/4] winCodeSign ${WINCODESIGN_VERSION} ← 本地缓存"
mkdir -p "$CACHE_BUILDER/winCodeSign"
cp -r "$LOCAL/electron-builder/winCodeSign-${WINCODESIGN_VERSION}" "$WINCS_DIR"
elif [ -d "$WINCS_DIR" ]; then
echo "[4/4] winCodeSign ${WINCODESIGN_VERSION} ← 缓存已存在"
else
echo "[4/4] winCodeSign ${WINCODESIGN_VERSION} ← 下载"
mkdir -p "$LOCAL/electron-builder"
mkdir -p "$CACHE_BUILDER/winCodeSign"
wget -q --show-progress -O "/tmp/winCodeSign-${WINCODESIGN_VERSION}.7z" \
"${GITHUB_PROXY}${GITHUB_ORIG}/winCodeSign-${WINCODESIGN_VERSION}/winCodeSign-${WINCODESIGN_VERSION}.7z"
cd "$CACHE_BUILDER/winCodeSign"
7z x -y "/tmp/winCodeSign-${WINCODESIGN_VERSION}.7z" -o"winCodeSign-${WINCODESIGN_VERSION}" >/dev/null
rm -f "/tmp/winCodeSign-${WINCODESIGN_VERSION}.7z"
cp -r "$WINCS_DIR" "$LOCAL/electron-builder/"
cd "$SCRIPT_DIR"
fi
echo ""
echo "===== 缓存恢复完成 ====="
echo "现在可以运行: ELECTRON_MIRROR=$ELECTRON_MIRROR npm run dist"