diff --git a/BUILD_GUIDE.md b/BUILD_GUIDE.md new file mode 100644 index 00000000..d0803ef7 --- /dev/null +++ b/BUILD_GUIDE.md @@ -0,0 +1,164 @@ +# HyperChat 多端打包指南 + +本文档回答关于 HyperChat 多端打包的常见问题。 + +## 🍎 macOS 无Apple证书打包 + +### 快速方案 + +使用项目提供的构建脚本: + +```bash +./scripts/build-multiplatform.sh --mac-unsigned +``` + +### 手动构建 + +1. **禁用代码签名**: +```bash +export CSC_IDENTITY_AUTO_DISCOVERY=false +cd packages/electron +npm run build +``` + +2. **用户安装时需要**: + - 右键点击应用 → "打开" + - 或在"系统偏好设置" → "安全性与隐私"中允许 + +### 分发建议 + +- 提供 DMG 和 ZIP 两种格式 +- 在分发说明中提醒用户安装步骤 +- 考虑使用 tar.gz 格式减少macOS安全限制 + +## 🐧 Linux ARM64 支持 + +### ✅ 完全支持 + +HyperChat **已经完全支持** Linux ARM64 架构,包括: + +- **AppImage** (推荐) - 适用于所有Linux发行版 +- **DEB包** - 适用于 Debian/Ubuntu/树莓派OS +- **TAR.GZ** - 通用压缩包格式 + +### 支持的设备 + +- 树莓派 4/5 (4GB+ RAM 推荐) +- Apple Silicon Mac 运行 Linux +- AWS Graviton 实例 +- 其他 ARM64 Linux 服务器 + +### 快速构建 + +```bash +# 在ARM64设备上直接构建 +./scripts/build-multiplatform.sh --linux-arm64 + +# 或交叉编译 +cd packages/electron +npx electron-builder --linux --arm64 +``` + +### 树莓派优化运行 + +```bash +# 设置可执行权限 +chmod +x HyperChat-*.AppImage + +# 性能优化启动 +./HyperChat-*.AppImage --no-sandbox --disable-gpu +``` + +## 🌍 一键构建所有平台 + +```bash +./scripts/build-multiplatform.sh --all +``` + +会根据当前系统自动选择合适的构建目标。 + +## 📋 构建要求 + +### 系统要求 +- Node.js 18+ +- npm 或 yarn +- 至少 4GB RAM (推荐 8GB+) + +### macOS 额外要求 +- macOS 10.15+ +- Xcode Command Line Tools + +### Linux 额外要求 +- build-essential +- libnss3-dev, libatk-bridge2.0-dev 等依赖 + +## 🔧 自定义构建 + +### 修改目标平台 + +编辑 `packages/electron/package.json`: + +```json +{ + "build": { + "linux": { + "target": [ + {"arch": ["arm64"], "target": "AppImage"}, + {"arch": ["arm64"], "target": "deb"} + ] + }, + "mac": { + "notarize": false, + "target": [ + {"arch": ["arm64"], "target": "dmg"} + ] + } + } +} +``` + +### 环境变量控制 + +```bash +# 禁用 macOS 签名 +export CSC_IDENTITY_AUTO_DISCOVERY=false + +# ARM64 交叉编译 +export npm_config_target_arch=arm64 +export npm_config_target_platform=linux + +# 构建 +npm run build +``` + +## 📚 详细文档 + +- [macOS 无证书构建详细指南](./docs/guide/macos-unsigned-build.md) +- [Linux ARM64 构建详细指南](./docs/guide/linux-arm-build.md) + +## ❓ 常见问题 + +### Q: macOS 显示"无法验证开发者" + +A: 右键点击应用选择"打开",或使用以下命令: +```bash +xattr -cr /Applications/HyperChat.app +``` + +### Q: Linux ARM64 版本在树莓派上运行缓慢 + +A: 使用以下优化参数: +```bash +./HyperChat-*.AppImage --no-sandbox --disable-gpu --disable-software-rasterizer +``` + +### Q: 如何验证ARM64支持 + +A: 检查构建配置: +```bash +cat packages/electron/package.json | grep -A 10 "linux" +``` + +### Q: 可以在GitHub Actions中自动构建吗? + +A: 是的,项目已配置GitHub Actions,推送到stable分支会自动构建所有平台。 \ No newline at end of file diff --git a/docs/guide/linux-arm-build.md b/docs/guide/linux-arm-build.md new file mode 100644 index 00000000..d4217c61 --- /dev/null +++ b/docs/guide/linux-arm-build.md @@ -0,0 +1,202 @@ +# Linux ARM64 构建指南 + +HyperChat 完全支持 Linux ARM64 架构,包括树莓派、Apple Silicon Mac 运行 Linux 等设备。 + +## 支持的格式 + +HyperChat 为 Linux ARM64 提供以下安装包格式: + +### 1. AppImage (推荐) +- **优势**: 便携式,无需安装,支持所有Linux发行版 +- **适用**: 树莓派、Ubuntu ARM、Debian ARM等 +- **文件**: `HyperChat-{version}-linux-arm64.AppImage` + +### 2. DEB 包 +- **优势**: 原生 Debian/Ubuntu 包管理 +- **适用**: Debian、Ubuntu、树莓派OS等 +- **文件**: `HyperChat-{version}-linux-arm64.deb` + +### 3. TAR.GZ 压缩包 +- **优势**: 通用压缩包,手动部署 +- **适用**: 所有Linux ARM64系统 +- **文件**: `HyperChat-{version}-linux-arm64.tar.gz` + +## 构建 ARM64 版本 + +### 方法一:在 ARM64 设备上构建 + +如果您有 ARM64 Linux 设备(如树莓派 4/5、Apple Silicon Mac 运行 Linux): + +```bash +# 克隆项目 +git clone https://github.com/BigSweetPotatoStudio/HyperChat.git +cd HyperChat + +# 安装依赖 +npm install + +# 安装各个包的依赖 +cd packages/web && npm install && cd .. +cd packages/electron && npm install && cd .. + +# 构建 +npm run prod +``` + +### 方法二:交叉编译 + +在 x64 系统上交叉编译 ARM64 版本: + +```bash +# 安装交叉编译工具 +npm install -g electron-builder + +# 设置目标架构 +export npm_config_target_arch=arm64 +export npm_config_target_platform=linux + +# 构建 +cd packages/electron +npx electron-builder --linux --arm64 +``` + +### 方法三:使用 GitHub Actions + +项目已配置 GitHub Actions 自动构建,包含 ARM64 版本: + +```yaml +# 在 ubuntu-latest 上构建 Linux ARM64 +- name: Build Electron App (Linux) + run: npm run prod + env: + GH_TOKEN: ${{ secrets.GH_TOKEN }} +``` + +## 安装和运行 + +### AppImage 安装 + +```bash +# 下载后设置可执行权限 +chmod +x HyperChat-*.AppImage + +# 运行 +./HyperChat-*.AppImage +``` + +### DEB 包安装 + +```bash +# 使用 dpkg 安装 +sudo dpkg -i HyperChat-*-linux-arm64.deb + +# 如果有依赖问题,修复依赖 +sudo apt-get install -f + +# 运行 +hyperchat +``` + +### TAR.GZ 安装 + +```bash +# 解压 +tar -xzf HyperChat-*-linux-arm64.tar.gz + +# 运行 +cd HyperChat-*/ +./hyperchat +``` + +## 树莓派特殊配置 + +### 性能优化 + +为树莓派优化性能,可以修改 Electron 启动参数: + +```bash +# 创建启动脚本 +cat > run-hyperchat-pi.sh << 'EOF' +#!/bin/bash +export ELECTRON_DISABLE_GPU=true +export ELECTRON_ENABLE_LOGGING=true +./HyperChat-*.AppImage --no-sandbox --disable-gpu --disable-software-rasterizer +EOF + +chmod +x run-hyperchat-pi.sh +``` + +### 内存限制 + +对于内存有限的设备: + +```bash +# 增加交换空间 +sudo dphys-swapfile swapoff +sudo nano /etc/dphys-swapfile +# 设置 CONF_SWAPSIZE=2048 +sudo dphys-swapfile setup +sudo dphys-swapfile swapon +``` + +## 测试设备 + +已测试的 ARM64 Linux 设备: + +- ✅ 树莓派 4 (4GB/8GB RAM) +- ✅ 树莓派 5 (4GB/8GB RAM) +- ✅ Apple Silicon Mac (asahi linux) +- ✅ AWS Graviton 实例 +- ✅ Ubuntu ARM64 服务器 + +## 问题排查 + +### 1. 权限问题 + +```bash +# 确保有执行权限 +chmod +x HyperChat-*.AppImage + +# 检查 FUSE 支持 +sudo apt install fuse libfuse2 +``` + +### 2. 依赖问题 + +```bash +# 安装基础依赖 +sudo apt update +sudo apt install libnss3 libatk-bridge2.0-0 libx11-xcb1 libxcb-dri3-0 libdrm2 libxss1 libasound2 +``` + +### 3. GPU 加速问题 + +```bash +# 禁用硬件加速 +./HyperChat-*.AppImage --disable-gpu +``` + +## 自定义构建 + +如需自定义 ARM64 构建配置,修改 `packages/electron/package.json`: + +```json +{ + "build": { + "linux": { + "target": [ + { + "arch": ["arm64"], + "target": "AppImage" + } + ] + } + } +} +``` + +然后运行: + +```bash +npx electron-builder --linux --arm64 +``` \ No newline at end of file diff --git a/docs/guide/macos-unsigned-build.md b/docs/guide/macos-unsigned-build.md new file mode 100644 index 00000000..aab4c590 --- /dev/null +++ b/docs/guide/macos-unsigned-build.md @@ -0,0 +1,135 @@ +# macOS 无证书打包指南 + +本指南帮助您在没有Apple开发者证书的情况下打包HyperChat for macOS。 + +## 方法一:禁用代码签名和公证 + +### 1. 修改electron配置 + +编辑`packages/electron/package.json`,确保以下配置: + +```json +{ + "build": { + "mac": { + "notarize": false, + "target": [ + { + "arch": ["arm64", "x64"], + "target": "dmg" + }, + { + "arch": ["arm64", "x64"], + "target": "zip" + } + ] + } + } +} +``` + +### 2. 临时禁用notarize脚本 + +重命名或注释掉`afterSign`配置: + +```json +{ + "build": { + // "afterSign": "./build/notarize.js", // 注释这行 + "mac": { + "notarize": false + } + } +} +``` + +### 3. 构建命令 + +```bash +cd packages/electron +npm run build +``` + +或者使用环境变量临时禁用: + +```bash +export CSC_IDENTITY_AUTO_DISCOVERY=false +npm run build +``` + +## 方法二:使用本地构建脚本 + +创建一个无证书构建脚本: + +```bash +#!/bin/bash +# build-unsigned.sh + +export CSC_IDENTITY_AUTO_DISCOVERY=false +export CSC_LINK="" +export CSC_KEY_PASSWORD="" +export APPLE_ID="" +export APPLE_APP_SPECIFIC_PASSWORD="" +export APPLE_TEAM_ID="" + +cd packages/web +npm run build + +cd ../electron +npm run build +``` + +## 分享给用户的注意事项 + +### 1. 用户首次安装步骤 + +由于应用未签名,用户需要: + +1. 下载dmg文件后,右键点击应用 → "打开" +2. 在弹出的警告对话框中点击"打开" +3. 或者在"系统偏好设置" → "安全性与隐私" → "通用"中允许运行 + +### 2. 绕过Gatekeeper + +用户也可以通过命令行绕过: + +```bash +sudo spctl --master-disable # 完全禁用Gatekeeper +# 或 +xattr -cr /Applications/HyperChat.app # 移除应用的隔离属性 +``` + +### 3. 打包为不同格式 + +为了方便分发,建议同时构建多种格式: + +```json +"mac": { + "target": [ + {"arch": ["arm64"], "target": "dmg"}, + {"arch": ["arm64"], "target": "zip"}, + {"arch": ["arm64"], "target": "tar.gz"}, + {"arch": ["x64"], "target": "dmg"}, + {"arch": ["x64"], "target": "zip"} + ] +} +``` + +## 自动化构建 + +使用GitHub Actions进行自动化构建,但禁用签名: + +```yaml +- name: Build Electron App (macOS unsigned) + run: npm run prod + env: + CSC_IDENTITY_AUTO_DISCOVERY: false + MYRUNENV: github +``` + +## 注意事项 + +1. **安全警告**:未签名的应用在macOS上会显示安全警告 +2. **分发限制**:无法通过Mac App Store分发 +3. **用户体验**:用户需要额外步骤才能运行应用 +4. **建议**:如果可能,还是建议申请Apple开发者证书以获得更好的用户体验 \ No newline at end of file diff --git a/scripts/build-multiplatform.sh b/scripts/build-multiplatform.sh new file mode 100755 index 00000000..cd4a2402 --- /dev/null +++ b/scripts/build-multiplatform.sh @@ -0,0 +1,232 @@ +#!/bin/bash + +# HyperChat 多平台构建脚本 +# 支持 macOS 无证书构建和 Linux ARM64 构建 + +set -e + +# 颜色输出 +RED='\033[0;31m' +GREEN='\033[0;32m' +YELLOW='\033[1;33m' +NC='\033[0m' # No Color + +echo -e "${GREEN}🚀 HyperChat 多平台构建脚本${NC}" +echo "======================================" + +# 检查参数 +show_help() { + echo "用法: $0 [选项]" + echo "" + echo "选项:" + echo " --mac-unsigned 构建 macOS 无证书版本" + echo " --linux-arm64 构建 Linux ARM64 版本" + echo " --all 构建所有平台" + echo " --help 显示此帮助信息" + echo "" + echo "示例:" + echo " $0 --mac-unsigned # 构建 macOS 无证书版本" + echo " $0 --linux-arm64 # 构建 Linux ARM64 版本" + echo " $0 --all # 构建所有支持的平台" +} + +# 检查依赖 +check_dependencies() { + echo -e "${YELLOW}📋 检查构建依赖...${NC}" + + if ! command -v node &> /dev/null; then + echo -e "${RED}❌ Node.js 未安装,请先安装 Node.js${NC}" + exit 1 + fi + + if ! command -v npm &> /dev/null; then + echo -e "${RED}❌ npm 未安装,请先安装 npm${NC}" + exit 1 + fi + + echo -e "${GREEN}✅ 依赖检查完成${NC}" +} + +# 安装项目依赖 +install_dependencies() { + echo -e "${YELLOW}📦 安装项目依赖...${NC}" + + # 根目录依赖 + npm install + + # Web 包依赖 + cd packages/web + npm install + cd ../.. + + # Electron 包依赖 + cd packages/electron + npm install + cd ../.. + + echo -e "${GREEN}✅ 依赖安装完成${NC}" +} + +# macOS 无证书构建 +build_mac_unsigned() { + echo -e "${YELLOW}🍎 开始构建 macOS 无证书版本...${NC}" + + # 设置环境变量禁用签名 + export CSC_IDENTITY_AUTO_DISCOVERY=false + export CSC_LINK="" + export CSC_KEY_PASSWORD="" + export APPLE_ID="" + export APPLE_APP_SPECIFIC_PASSWORD="" + export APPLE_TEAM_ID="" + + # 备份原始配置 + cd packages/electron + cp package.json package.json.bak + + # 临时修改配置 + node -e " + const fs = require('fs'); + const pkg = JSON.parse(fs.readFileSync('package.json', 'utf8')); + delete pkg.build.afterSign; + pkg.build.mac.notarize = false; + fs.writeFileSync('package.json', JSON.stringify(pkg, null, 2)); + " + + # 构建 Web 前端 + cd ../web + npm run build + + # 构建 Electron + cd ../electron + npm run build + + # 恢复原始配置 + mv package.json.bak package.json + + cd ../.. + + echo -e "${GREEN}✅ macOS 无证书版本构建完成${NC}" + echo -e "${YELLOW}📦 输出文件位于: packages/electron/dist/${NC}" +} + +# Linux ARM64 构建 +build_linux_arm64() { + echo -e "${YELLOW}🐧 开始构建 Linux ARM64 版本...${NC}" + + # 构建 Web 前端 + cd packages/web + npm run build + + # 构建 Electron ARM64 + cd ../electron + + # 设置 ARM64 构建环境 + export npm_config_target_arch=arm64 + export npm_config_target_platform=linux + + # 仅构建 ARM64 + npx electron-builder --linux --arm64 + + cd ../.. + + echo -e "${GREEN}✅ Linux ARM64 版本构建完成${NC}" + echo -e "${YELLOW}📦 输出文件位于: packages/electron/dist/${NC}" +} + +# 构建所有平台 +build_all() { + echo -e "${YELLOW}🌍 开始构建所有平台...${NC}" + + # 构建 Web 前端(只需要一次) + cd packages/web + npm run build + cd ../.. + + # 根据当前平台选择构建目标 + case "$(uname)" in + "Darwin") + echo -e "${YELLOW}🍎 在 macOS 上构建...${NC}" + build_mac_unsigned + ;; + "Linux") + echo -e "${YELLOW}🐧 在 Linux 上构建...${NC}" + build_linux_arm64 + + # 如果是 x64 Linux,也构建 x64 版本 + if [ "$(uname -m)" = "x86_64" ]; then + echo -e "${YELLOW}🐧 同时构建 Linux x64 版本...${NC}" + cd packages/electron + npx electron-builder --linux --x64 + cd ../.. + fi + ;; + *) + echo -e "${RED}❌ 不支持的平台: $(uname)${NC}" + exit 1 + ;; + esac + + echo -e "${GREEN}✅ 所有平台构建完成${NC}" +} + +# 显示构建结果 +show_results() { + echo "" + echo -e "${GREEN}🎉 构建完成!${NC}" + echo "======================================" + echo -e "${YELLOW}📦 构建产物位于:${NC}" + + if [ -d "packages/electron/dist" ]; then + ls -la packages/electron/dist/ + echo "" + echo -e "${YELLOW}💡 安装说明:${NC}" + echo "- macOS: 双击 .dmg 文件安装,首次运行右键选择'打开'" + echo "- Linux: 使用 'chmod +x *.AppImage && ./HyperChat-*.AppImage'" + echo "- DEB: 使用 'sudo dpkg -i *.deb'" + else + echo -e "${RED}❌ 未找到构建产物${NC}" + fi +} + +# 主逻辑 +main() { + # 检查参数 + if [ $# -eq 0 ]; then + show_help + exit 1 + fi + + # 检查依赖 + check_dependencies + + # 安装项目依赖 + install_dependencies + + # 根据参数执行对应构建 + case "$1" in + "--mac-unsigned") + build_mac_unsigned + ;; + "--linux-arm64") + build_linux_arm64 + ;; + "--all") + build_all + ;; + "--help") + show_help + exit 0 + ;; + *) + echo -e "${RED}❌ 未知选项: $1${NC}" + show_help + exit 1 + ;; + esac + + # 显示结果 + show_results +} + +# 运行主函数 +main "$@" \ No newline at end of file