下载速度显示

This commit is contained in:
2025-12-03 18:20:44 +08:00
parent aa65ad32b5
commit 9260d77eda

View File

@@ -811,7 +811,7 @@ build_from_source() {
fi fi
fi fi
# 下载依赖(显示详细进度) # 下载依赖(显示详细进度和速度
echo -e "${BLUE}开始下载 Go 依赖包(这可能需要一些时间)...${NC}" echo -e "${BLUE}开始下载 Go 依赖包(这可能需要一些时间)...${NC}"
echo -e "${YELLOW}提示: 如果下载速度慢,请检查网络连接和代理设置${NC}" echo -e "${YELLOW}提示: 如果下载速度慢,请检查网络连接和代理设置${NC}"
echo "" echo ""
@@ -819,33 +819,119 @@ build_from_source() {
# 设置更长的超时时间和启用详细输出 # 设置更长的超时时间和启用详细输出
DOWNLOAD_START_TIME=$(date +%s) DOWNLOAD_START_TIME=$(date +%s)
DOWNLOAD_LOG="/tmp/go_download_$$.log" 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 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 GOSUMDB=off" 2>/dev/null || true
sudo bash -c "cd '$SOURCE_DIR' && $GO_PATH_ENV && go env -w GOPRIVATE=*" 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_END_TIME=$(date +%s)
DOWNLOAD_DURATION=$((DOWNLOAD_END_TIME - DOWNLOAD_START_TIME)) DOWNLOAD_DURATION=$((DOWNLOAD_END_TIME - DOWNLOAD_START_TIME))
echo -e "${GREEN}✓ 依赖下载完成 (耗时: ${DOWNLOAD_DURATION}秒)${NC}"
# 显示下载摘要 # 统计下载信息(从 JSON 输出中解析)
echo -e "${BLUE}下载摘要:${NC}" TOTAL_PACKAGES=$(grep -c '"Path":' "$DOWNLOAD_LOG" 2>/dev/null || echo "0")
grep -E "(downloading|get|found)" "$DOWNLOAD_LOG" | tail -20 | while IFS= read -r line; do SUCCESS_COUNT=$(grep -c '"Version":' "$DOWNLOAD_LOG" 2>/dev/null || echo "0")
echo " $line"
# 如果没有 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 done || true
else 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_EXIT_CODE=$?
DOWNLOAD_END_TIME=$(date +%s) DOWNLOAD_END_TIME=$(date +%s)
DOWNLOAD_DURATION=$((DOWNLOAD_END_TIME - DOWNLOAD_START_TIME)) 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 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}" echo -e "${YELLOW}继续尝试编译,如果失败请检查网络连接${NC}"
else else
echo ""
echo -e "${YELLOW}⚠ 使用国内镜像下载失败 (耗时: ${DOWNLOAD_DURATION}秒,退出码: ${DOWNLOAD_EXIT_CODE})${NC}" echo -e "${YELLOW}⚠ 使用国内镜像下载失败 (耗时: ${DOWNLOAD_DURATION}秒,退出码: ${DOWNLOAD_EXIT_CODE})${NC}"
echo -e "${BLUE}已下载: ${GREEN}${DOWNLOADED_COUNT}${NC} 个包"
echo -e "${YELLOW}最后30行日志:${NC}" echo -e "${YELLOW}最后30行日志:${NC}"
tail -30 "$DOWNLOAD_LOG" 2>/dev/null || true tail -30 "$DOWNLOAD_LOG" 2>/dev/null || true
echo "" echo ""
@@ -853,11 +939,67 @@ build_from_source() {
# 如果失败,尝试使用 direct 模式,直接从源码仓库下载 # 如果失败,尝试使用 direct 模式,直接从源码仓库下载
# 注意:不使用 proxy.golang.org因为在中国大陆无法访问 # 注意:不使用 proxy.golang.org因为在中国大陆无法访问
GO_ENV="$GO_PATH_ENV GOPROXY=direct GOSUMDB=off GOTIMEOUT=300" 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) 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_END_TIME=$(date +%s)
DOWNLOAD_DURATION=$((DOWNLOAD_END_TIME - DOWNLOAD_START_TIME)) 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 else
echo -e "${RED}下载依赖失败最后100行日志:${NC}" echo -e "${RED}下载依赖失败最后100行日志:${NC}"
tail -100 "$DOWNLOAD_LOG" 2>/dev/null || true tail -100 "$DOWNLOAD_LOG" 2>/dev/null || true