#!/bin/bash # ============================================================ # U-Claw 虾盘 构建脚本 # 在你的 Mac 上运行,打包所有依赖到 U-Claw 目录 # 用法: ./build-uclaw.sh # ============================================================ set -eo pipefail SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)" UCLAW_DIR="$SCRIPT_DIR/U-Claw" SOURCE_DIR="$SCRIPT_DIR/openclaw-2026.3.7" NODE_VERSION="22.16.0" # 颜色输出 RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' CYAN='\033[0;36m' NC='\033[0m' info() { echo -e "${CYAN}[U-Claw]${NC} $1"; } ok() { echo -e "${GREEN}[✓]${NC} $1"; } warn() { echo -e "${YELLOW}[!]${NC} $1"; } error() { echo -e "${RED}[✗]${NC} $1"; exit 1; } echo "" echo " 🦞 U-Claw 虾盘 构建工具" echo " ========================" echo " OpenClaw 一键安装 U 盘制作" echo "" # ---- 1. 创建 U-Claw 目录结构 ---- info "创建 U-Claw 目录结构..." rm -rf "$UCLAW_DIR" mkdir -p "$UCLAW_DIR"/{runtime/{node-mac-arm64,node-mac-x64,node-win-x64},openclaw,memory,persona,skills,tools} # ---- 2. 下载 Node.js 各平台版本 ---- DOWNLOAD_DIR="$SCRIPT_DIR/.download-cache" mkdir -p "$DOWNLOAD_DIR" download_node() { local PLATFORM=$1 # darwin, win local ARCH=$2 # arm64, x64 local EXT=$3 # tar.gz, zip local DEST=$4 # 目标目录名 local FILENAME="node-v${NODE_VERSION}-${PLATFORM}-${ARCH}" local URL="https://nodejs.org/dist/v${NODE_VERSION}/${FILENAME}.${EXT}" local CACHED="$DOWNLOAD_DIR/${FILENAME}.${EXT}" if [ -f "$CACHED" ]; then ok "Node.js ${PLATFORM}-${ARCH} 已缓存" else info "下载 Node.js ${PLATFORM}-${ARCH}..." # 尝试直接下载,如果失败则使用镜像 if ! curl -fL --connect-timeout 10 -o "$CACHED" "$URL" 2>/dev/null; then warn "官方源下载失败,尝试淘宝镜像..." local MIRROR_URL="https://npmmirror.com/mirrors/node/v${NODE_VERSION}/${FILENAME}.${EXT}" curl -fL -o "$CACHED" "$MIRROR_URL" || error "下载 Node.js ${PLATFORM}-${ARCH} 失败" fi ok "下载完成: Node.js ${PLATFORM}-${ARCH}" fi info "解压 Node.js ${PLATFORM}-${ARCH}..." if [ "$EXT" = "tar.gz" ]; then tar xzf "$CACHED" -C "$UCLAW_DIR/runtime/$DEST/" --strip-components=1 elif [ "$EXT" = "zip" ]; then # Windows zip local TMP_UNZIP="$DOWNLOAD_DIR/tmp-unzip-$$" mkdir -p "$TMP_UNZIP" unzip -q "$CACHED" -d "$TMP_UNZIP" cp -R "$TMP_UNZIP"/${FILENAME}/* "$UCLAW_DIR/runtime/$DEST/" rm -rf "$TMP_UNZIP" fi ok "Node.js ${PLATFORM}-${ARCH} 就绪" } # 下载三个平台的 Node.js download_node "darwin" "arm64" "tar.gz" "node-mac-arm64" # Mac Apple Silicon download_node "darwin" "x64" "tar.gz" "node-mac-x64" # Mac Intel download_node "win" "x64" "zip" "node-win-x64" # Windows x64 # ---- 3. 复制 OpenClaw 源码 ---- info "复制 OpenClaw 源码..." rsync -a --exclude='.git' --exclude='node_modules' --exclude='.github' \ "$SOURCE_DIR/" "$UCLAW_DIR/openclaw/" ok "OpenClaw 源码复制完成" # ---- 4. 安装依赖 (使用淘宝镜像) ---- info "安装 npm 依赖(使用淘宝镜像)..." # 使用 U-Claw 自带的 Node.js 来安装 if [ "$(uname -m)" = "arm64" ]; then NODE_DIR="$UCLAW_DIR/runtime/node-mac-arm64" NODE_BIN="$UCLAW_DIR/runtime/node-mac-arm64/bin/node" NPM_BIN="$UCLAW_DIR/runtime/node-mac-arm64/bin/npm" else NODE_DIR="$UCLAW_DIR/runtime/node-mac-x64" NODE_BIN="$UCLAW_DIR/runtime/node-mac-x64/bin/node" NPM_BIN="$UCLAW_DIR/runtime/node-mac-x64/bin/npm" fi cd "$UCLAW_DIR/openclaw" # 设置淘宝镜像 "$NODE_BIN" "$NPM_BIN" config set registry https://registry.npmmirror.com --location=project 2>/dev/null || true # 安装 pnpm(OpenClaw build 脚本依赖 pnpm) info "安装 pnpm..." "$NODE_BIN" "$NPM_BIN" install -g pnpm --registry=https://registry.npmmirror.com 2>&1 | tail -3 PNPM_BIN="$NODE_DIR/bin/pnpm" [ -x "$PNPM_BIN" ] || error "pnpm 安装失败: $PNPM_BIN 不存在" # 安装依赖(使用 pnpm,与上游一致) info "pnpm install 中...(可能需要几分钟)" cd "$UCLAW_DIR/openclaw" "$PNPM_BIN" install --registry=https://registry.npmmirror.com 2>&1 | tail -5 ok "依赖安装完成" # ---- 5. 构建 OpenClaw ---- info "构建 OpenClaw..." cd "$UCLAW_DIR/openclaw" "$PNPM_BIN" run build 2>&1 | tail -10 if [ -d "$UCLAW_DIR/openclaw/dist" ]; then ok "构建成功,dist/ 已生成" else error "构建失败:dist/ 目录未生成,请检查错误信息" fi cd "$SCRIPT_DIR" # ---- 6. 复制用户脚本和说明 ---- info "复制用户脚本..." # 从 scripts 模板目录复制(构建脚本同级的 uclaw-scripts/ 目录) SCRIPTS_SRC="$SCRIPT_DIR/uclaw-scripts" if [ -d "$SCRIPTS_SRC" ]; then cp "$SCRIPTS_SRC/启动菜单.command" "$UCLAW_DIR/" 2>/dev/null || true cp "$SCRIPTS_SRC/启动菜单.bat" "$UCLAW_DIR/" 2>/dev/null || true cp "$SCRIPTS_SRC/运行.command" "$UCLAW_DIR/" 2>/dev/null || true cp "$SCRIPTS_SRC/运行.bat" "$UCLAW_DIR/" 2>/dev/null || true cp "$SCRIPTS_SRC/安装到电脑.command" "$UCLAW_DIR/" 2>/dev/null || true cp "$SCRIPTS_SRC/安装到电脑.bat" "$UCLAW_DIR/" 2>/dev/null || true cp "$SCRIPTS_SRC/使用说明.txt" "$UCLAW_DIR/" 2>/dev/null || true cp "$SCRIPTS_SRC/中国用户指南.txt" "$UCLAW_DIR/" 2>/dev/null || true # 复制教程文档 mkdir -p "$UCLAW_DIR/docs" cp "$SCRIPT_DIR/docs/教程-OpenClaw中国区完全指南.md" "$UCLAW_DIR/docs/" 2>/dev/null || true # 复制微信二维码 cp "$SCRIPT_DIR/微信二维码.jpg" "$UCLAW_DIR/" 2>/dev/null || true chmod +x "$UCLAW_DIR/启动菜单.command" "$UCLAW_DIR/运行.command" "$UCLAW_DIR/安装到电脑.command" 2>/dev/null || true ok "用户脚本已复制(含启动菜单、中国用户指南、微信二维码)" else warn "找不到 uclaw-scripts/ 目录,请手动复制脚本到 U-Claw/" fi # ---- 7. 计算大小 ---- echo "" echo " ============================================" info "U-Claw 构建完成!" echo "" TOTAL_SIZE=$(du -sh "$UCLAW_DIR" | cut -f1) echo " 总大小: $TOTAL_SIZE" echo "" du -sh "$UCLAW_DIR"/runtime/node-mac-arm64 2>/dev/null | awk '{print " Node.js Mac ARM64: "$1}' du -sh "$UCLAW_DIR"/runtime/node-mac-x64 2>/dev/null | awk '{print " Node.js Mac x64: "$1}' du -sh "$UCLAW_DIR"/runtime/node-win-x64 2>/dev/null | awk '{print " Node.js Win x64: "$1}' du -sh "$UCLAW_DIR"/openclaw 2>/dev/null | awk '{print " OpenClaw + 依赖: "$1}' echo "" echo " 将 U-Claw 文件夹整个复制到 U 盘即可" echo " ============================================" echo ""