diff --git a/install.sh b/install.sh index 520ff58..bc03a2d 100755 --- a/install.sh +++ b/install.sh @@ -811,7 +811,7 @@ build_from_source() { fi fi - # 下载依赖(显示详细进度) + # 下载依赖(显示详细进度和速度) echo -e "${BLUE}开始下载 Go 依赖包(这可能需要一些时间)...${NC}" echo -e "${YELLOW}提示: 如果下载速度慢,请检查网络连接和代理设置${NC}" echo "" @@ -819,33 +819,119 @@ build_from_source() { # 设置更长的超时时间和启用详细输出 DOWNLOAD_START_TIME=$(date +%s) DOWNLOAD_LOG="/tmp/go_download_$$.log" + DOWNLOAD_PROGRESS_LOG="/tmp/go_progress_$$.log" - # 使用 -x 显示详细执行过程 - echo -e "${BLUE}正在下载依赖包,显示详细进度...${NC}" # 在下载前再次确认环境变量设置 sudo bash -c "cd '$SOURCE_DIR' && $GO_PATH_ENV && go env -w GOPROXY=${GO_PROXY}" 2>/dev/null || true sudo bash -c "cd '$SOURCE_DIR' && $GO_PATH_ENV && go env -w GOSUMDB=off" 2>/dev/null || true sudo bash -c "cd '$SOURCE_DIR' && $GO_PATH_ENV && go env -w GOPRIVATE=*" 2>/dev/null || true - if sudo bash -c "cd '$SOURCE_DIR' && $GO_ENV && timeout 600 go mod download -x" > "$DOWNLOAD_LOG" 2>&1; then + # 使用后台进程显示实时进度 + ( + DOWNLOADED_COUNT=0 + LAST_UPDATE_TIME=$(date +%s) + LAST_COUNT=0 + LAST_PACKAGE="" + + while [ ! -f "${DOWNLOAD_PROGRESS_LOG}.done" ]; do + sleep 1 + + # 统计已下载的包数量(从日志中统计) + if [ -f "$DOWNLOAD_LOG" ]; then + CURRENT_COUNT=$(grep -c "go: downloading" "$DOWNLOAD_LOG" 2>/dev/null || echo "0") + else + CURRENT_COUNT=0 + fi + + if [ "$CURRENT_COUNT" -gt "$LAST_COUNT" ]; then + DOWNLOADED_COUNT=$CURRENT_COUNT + CURRENT_TIME=$(date +%s) + ELAPSED=$((CURRENT_TIME - DOWNLOAD_START_TIME)) + + # 计算速度(每秒下载的包数) + if [ "$ELAPSED" -gt 0 ]; then + SPEED=$(echo "scale=2; $DOWNLOADED_COUNT / $ELAPSED" | bc 2>/dev/null || echo "0") + echo -ne "\r${BLUE}进度: 已下载 ${GREEN}${DOWNLOADED_COUNT}${NC} 个包 | 耗时: ${ELAPSED}秒 | 速度: ${GREEN}${SPEED}${NC} 包/秒" + fi + + LAST_COUNT=$CURRENT_COUNT + LAST_UPDATE_TIME=$CURRENT_TIME + fi + + # 显示当前正在下载的包 + if [ -f "$DOWNLOAD_LOG" ]; then + CURRENT_PACKAGE=$(grep "go: downloading" "$DOWNLOAD_LOG" 2>/dev/null | tail -1 | sed 's/go: downloading //' | cut -d' ' -f1) + if [ -n "$CURRENT_PACKAGE" ] && [ "$CURRENT_PACKAGE" != "$LAST_PACKAGE" ]; then + echo "" + echo -e "${BLUE} → 正在下载: ${GREEN}${CURRENT_PACKAGE}${NC}" + LAST_PACKAGE=$CURRENT_PACKAGE + fi + fi + done + ) & + PROGRESS_PID=$! + + # 使用 -json 格式下载,便于解析进度(同时输出到终端和文件) + if sudo bash -c "cd '$SOURCE_DIR' && $GO_ENV && timeout 600 go mod download -json" 2>&1 | tee "$DOWNLOAD_LOG"; then + # 停止进度显示进程 + touch "${DOWNLOAD_PROGRESS_LOG}.done" + sleep 1 + kill "$PROGRESS_PID" 2>/dev/null || true + wait "$PROGRESS_PID" 2>/dev/null || true + DOWNLOAD_END_TIME=$(date +%s) DOWNLOAD_DURATION=$((DOWNLOAD_END_TIME - DOWNLOAD_START_TIME)) - echo -e "${GREEN}✓ 依赖下载完成 (耗时: ${DOWNLOAD_DURATION}秒)${NC}" - # 显示下载摘要 - echo -e "${BLUE}下载摘要:${NC}" - grep -E "(downloading|get|found)" "$DOWNLOAD_LOG" | tail -20 | while IFS= read -r line; do - echo " $line" + + # 统计下载信息(从 JSON 输出中解析) + TOTAL_PACKAGES=$(grep -c '"Path":' "$DOWNLOAD_LOG" 2>/dev/null || echo "0") + SUCCESS_COUNT=$(grep -c '"Version":' "$DOWNLOAD_LOG" 2>/dev/null || echo "0") + + # 如果没有 JSON 格式,尝试从普通输出统计 + if [ "$TOTAL_PACKAGES" = "0" ]; then + TOTAL_PACKAGES=$(grep -c "go: downloading" "$DOWNLOAD_LOG" 2>/dev/null || echo "0") + SUCCESS_COUNT=$TOTAL_PACKAGES + fi + + echo "" + echo -e "${GREEN}✓ 依赖下载完成${NC}" + echo -e "${BLUE}下载统计:${NC}" + echo -e " 总包数: ${GREEN}${TOTAL_PACKAGES}${NC}" + echo -e " 成功下载: ${GREEN}${SUCCESS_COUNT}${NC}" + echo -e " 总耗时: ${GREEN}${DOWNLOAD_DURATION}${NC}秒" + + if [ "$DOWNLOAD_DURATION" -gt 0 ] && [ "$SUCCESS_COUNT" -gt 0 ]; then + AVG_SPEED=$(echo "scale=2; $SUCCESS_COUNT / $DOWNLOAD_DURATION" | bc 2>/dev/null || echo "0") + echo -e " 平均速度: ${GREEN}${AVG_SPEED}${NC} 包/秒" + fi + + # 显示最后下载的几个包 + echo -e "${BLUE}最后下载的包:${NC}" + grep '"Path":' "$DOWNLOAD_LOG" | tail -10 | sed 's/.*"Path": "\([^"]*\)".*/ ✓ \1/' | while IFS= read -r line; do + echo "$line" done || true else + # 停止进度显示进程 + touch "${DOWNLOAD_PROGRESS_LOG}.done" + sleep 1 + kill "$PROGRESS_PID" 2>/dev/null || true + wait "$PROGRESS_PID" 2>/dev/null || true + DOWNLOAD_EXIT_CODE=$? DOWNLOAD_END_TIME=$(date +%s) DOWNLOAD_DURATION=$((DOWNLOAD_END_TIME - DOWNLOAD_START_TIME)) + # 统计已下载的包 + DOWNLOADED_COUNT=$(grep -c "go: downloading" "$DOWNLOAD_LOG" 2>/dev/null || echo "0") + if [ "$DOWNLOAD_EXIT_CODE" = "124" ]; then - echo -e "${YELLOW}⚠ 下载超时 (${DOWNLOAD_DURATION}秒),但可能已下载部分依赖${NC}" + echo "" + echo -e "${YELLOW}⚠ 下载超时 (${DOWNLOAD_DURATION}秒)${NC}" + echo -e "${BLUE}已下载: ${GREEN}${DOWNLOADED_COUNT}${NC} 个包" echo -e "${YELLOW}继续尝试编译,如果失败请检查网络连接${NC}" else + echo "" echo -e "${YELLOW}⚠ 使用国内镜像下载失败 (耗时: ${DOWNLOAD_DURATION}秒,退出码: ${DOWNLOAD_EXIT_CODE})${NC}" + echo -e "${BLUE}已下载: ${GREEN}${DOWNLOADED_COUNT}${NC} 个包" echo -e "${YELLOW}最后30行日志:${NC}" tail -30 "$DOWNLOAD_LOG" 2>/dev/null || true echo "" @@ -853,11 +939,67 @@ build_from_source() { # 如果失败,尝试使用 direct 模式,直接从源码仓库下载 # 注意:不使用 proxy.golang.org,因为在中国大陆无法访问 GO_ENV="$GO_PATH_ENV GOPROXY=direct GOSUMDB=off GOTIMEOUT=300" + + # 重新启动进度显示 + ( + DOWNLOADED_COUNT=0 + LAST_UPDATE_TIME=$(date +%s) + LAST_COUNT=0 + + while [ ! -f "$DOWNLOAD_PROGRESS_LOG.done2" ]; do + sleep 1 + + CURRENT_COUNT=$(grep -c "go: downloading" "$DOWNLOAD_LOG" 2>/dev/null || echo "0") + + if [ "$CURRENT_COUNT" -gt "$LAST_COUNT" ]; then + DOWNLOADED_COUNT=$CURRENT_COUNT + CURRENT_TIME=$(date +%s) + ELAPSED=$((CURRENT_TIME - DOWNLOAD_START_TIME)) + + if [ "$ELAPSED" -gt 0 ]; then + SPEED=$(echo "scale=2; $DOWNLOADED_COUNT / $ELAPSED" | bc 2>/dev/null || echo "0") + echo -ne "\r${BLUE}进度: 已下载 ${GREEN}${DOWNLOADED_COUNT}${NC} 个包 | 耗时: ${ELAPSED}秒 | 速度: ${GREEN}${SPEED}${NC} 包/秒" + fi + + LAST_COUNT=$CURRENT_COUNT + fi + + CURRENT_PACKAGE=$(grep "go: downloading" "$DOWNLOAD_LOG" | tail -1 | sed 's/go: downloading //' | cut -d' ' -f1) + if [ -n "$CURRENT_PACKAGE" ] && [ "$CURRENT_PACKAGE" != "$LAST_PACKAGE" ]; then + echo "" + echo -e "${BLUE} → 正在下载: ${GREEN}${CURRENT_PACKAGE}${NC}" + LAST_PACKAGE=$CURRENT_PACKAGE + fi + done + ) & + PROGRESS_PID2=$! + DOWNLOAD_START_TIME=$(date +%s) - if sudo bash -c "cd '$SOURCE_DIR' && $GO_ENV && timeout 600 go mod download -x" > "$DOWNLOAD_LOG" 2>&1; then + if sudo bash -c "cd '$SOURCE_DIR' && $GO_ENV && timeout 600 go mod download -json" > "$DOWNLOAD_LOG" 2>&1; then + # 停止进度显示进程 + touch "$DOWNLOAD_PROGRESS_LOG.done2" + sleep 1 + kill "$PROGRESS_PID2" 2>/dev/null || true + wait "$PROGRESS_PID2" 2>/dev/null || true + DOWNLOAD_END_TIME=$(date +%s) DOWNLOAD_DURATION=$((DOWNLOAD_END_TIME - DOWNLOAD_START_TIME)) - echo -e "${GREEN}✓ 依赖下载完成 (耗时: ${DOWNLOAD_DURATION}秒)${NC}" + + # 统计下载信息 + TOTAL_PACKAGES=$(grep -c '"Path":' "$DOWNLOAD_LOG" 2>/dev/null || echo "0") + SUCCESS_COUNT=$(grep -c '"Version":' "$DOWNLOAD_LOG" 2>/dev/null || echo "0") + + echo "" + echo -e "${GREEN}✓ 依赖下载完成${NC}" + echo -e "${BLUE}下载统计:${NC}" + echo -e " 总包数: ${GREEN}${TOTAL_PACKAGES}${NC}" + echo -e " 成功下载: ${GREEN}${SUCCESS_COUNT}${NC}" + echo -e " 总耗时: ${GREEN}${DOWNLOAD_DURATION}${NC}秒" + + if [ "$DOWNLOAD_DURATION" -gt 0 ] && [ "$SUCCESS_COUNT" -gt 0 ]; then + AVG_SPEED=$(echo "scale=2; $SUCCESS_COUNT / $DOWNLOAD_DURATION" | bc 2>/dev/null || echo "0") + echo -e " 平均速度: ${GREEN}${AVG_SPEED}${NC} 包/秒" + fi else echo -e "${RED}下载依赖失败,最后100行日志:${NC}" tail -100 "$DOWNLOAD_LOG" 2>/dev/null || true