install.sh 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. #!/bin/bash
  2. # DoTouchAI 一键安装脚本(macOS)
  3. #
  4. # 用法(收件方只需这一行):
  5. # curl -fsSL https://raw.githubusercontent.com/USERNAME/REPO/main/install.sh | bash
  6. #
  7. # 无需 Apple 签名公证也能在新版 macOS(含 26)上正常安装打开:
  8. # 下载 DMG → 校验 sha256 → 挂载 → ditto 拷贝到 /Applications
  9. # → xattr -cr 清除 com.apple.quarantine 与 com.apple.provenance → 启动
  10. #
  11. # 发布新版时只需改下面 BASE_URL / VERSION / SHA256 三项即可。
  12. set -euo pipefail
  13. # ── 配置 ────────────────────────────────────────────────────────────────
  14. # DMG 托管在 Git releases(dist/ 被 gitignore 且超 100M 不入 git 树)。
  15. # 默认指向你的自建 Gitea(需先把仓库设为「公开」,否则外人 curl 会 404):
  16. # Gitea raw: http://47.112.106.152:10880/Evan/EvanAgent/raw/branch/master/dsh-desktop/install.sh
  17. # Gitea rel: http://47.112.106.152:10880/Evan/EvanAgent/releases/download/v0.4.1/DoTouchAI-0.4.1-arm64.dmg
  18. # 若改用 GitHub 公开仓库分发(HTTPS、更受信任),只需把下面 BASE_URL 改成:
  19. # https://github.com/<user>/<repo>/releases/download
  20. BASE_URL="${DOTOUCHAI_BASE_URL:-http://47.112.106.152:10880/Evan/EvanAgent/releases/download}"
  21. VERSION="${DOTOUCHAI_VERSION:-0.4.1}"
  22. # 0.4.1 arm64 DMG 的 sha256(发布新版后用 shasum -a 256 更新):
  23. SHA256_ARM="${DOTOUCHAI_SHA256:-05941c6b1f95780e85d0dad8176c80e355756344bcf4641589da9c632a4eca48}"
  24. # ── 架构检测 ─────────────────────────────────────────────────────────────
  25. ARCH="$(uname -m)"
  26. case "$ARCH" in
  27. arm64)
  28. DMG="DoTouchAI-${VERSION}-arm64.dmg"
  29. EXPECTED_SHA="$SHA256_ARM"
  30. ;;
  31. x86_64)
  32. echo "✗ 暂未提供 Intel (x86_64) Mac 版本,目前仅 arm64。"
  33. echo " 新版 Mac(M1/M2/M3/M4…)均为 arm64;如确为 Intel 机器,请反馈以补 x64 构建。"
  34. exit 1
  35. ;;
  36. *)
  37. echo "✗ 不支持的架构:$ARCH"
  38. exit 1
  39. ;;
  40. esac
  41. URL="${BASE_URL}/v${VERSION}/${DMG}"
  42. APP_NAME="DoTouchAI"
  43. APP_DST="/Applications/${APP_NAME}.app"
  44. # ── 临时资源 ─────────────────────────────────────────────────────────────
  45. TMP_DMG="$(mktemp -t dotouchai).dmg"
  46. MNT="$(mktemp -d -t dotouchai-mnt)"
  47. cleanup() {
  48. hdiutil detach "$MNT" -quiet >/dev/null 2>&1 || true
  49. rmdir "$MNT" 2>/dev/null || true
  50. rm -f "$TMP_DMG"
  51. }
  52. trap cleanup EXIT
  53. echo "→ 下载 ${DMG} …"
  54. echo " ${URL}"
  55. curl -fSL "$URL" -o "$TMP_DMG"
  56. echo "→ 校验完整性(sha256)…"
  57. ACTUAL_SHA="$(shasum -a 256 "$TMP_DMG" | cut -d' ' -f1)"
  58. if [ "$ACTUAL_SHA" != "$EXPECTED_SHA" ]; then
  59. echo "✗ 校验和不匹配"
  60. echo " 期望:$EXPECTED_SHA"
  61. echo " 实际:$ACTUAL_SHA"
  62. echo " 下载可能不完整或被篡改,已中止。"
  63. exit 1
  64. fi
  65. echo " ✓ 校验通过"
  66. echo "→ 挂载安装包 …"
  67. hdiutil attach "$TMP_DMG" -nobrowse -mountpoint "$MNT" -quiet
  68. APP_SRC="$MNT/${APP_NAME}.app"
  69. if [ ! -d "$APP_SRC" ]; then
  70. echo "✗ 安装包内未找到 ${APP_NAME}.app"
  71. exit 1
  72. fi
  73. # 退出可能正在运行的旧实例(用 osascript 精确退出,避免误杀其他 Electron 应用)
  74. osascript -e "tell application \"${APP_NAME}\" to quit" 2>/dev/null || true
  75. sleep 1
  76. # 替换旧版本
  77. if [ -d "$APP_DST" ]; then
  78. echo "→ 移除旧版本 …"
  79. rm -rf "$APP_DST"
  80. fi
  81. echo "→ 拷贝到 /Applications …"
  82. # ditto 保留 bundle 结构与元数据,优于 cp
  83. if ! ditto "$APP_SRC" "$APP_DST"; then
  84. echo "✗ 拷贝失败。若提示权限不足,请用管理员重试:"
  85. echo " sudo curl -fsSL <脚本URL> | sudo bash"
  86. exit 1
  87. fi
  88. echo "→ 清除 Gatekeeper 隔离标记(quarantine + provenance)…"
  89. xattr -cr "$APP_DST"
  90. echo "→ 卸载安装包 …"
  91. hdiutil detach "$MNT" -quiet
  92. echo ""
  93. echo "✓ 安装完成:${APP_DST}"
  94. echo " 双击即可启动,或终端执行:open -a ${APP_NAME}"
  95. echo ""
  96. # 直接启动(除非显式要求不启动)
  97. if [ -z "${DOTOUCHAI_NO_LAUNCH:-}" ]; then
  98. echo "→ 启动 ${APP_NAME} …"
  99. open -a "$APP_NAME"
  100. fi