#!/bin/bash # ============================================ # LinkMaster Node Vendor 依赖打包脚本 # 用途:将项目依赖下载到 vendor 目录,客户端克隆后可直接编译,无需网络 # 使用方法: ./vendor.sh # ============================================ set -e # 颜色输出 RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' BLUE='\033[0;34m' NC='\033[0m' # 脚本目录 SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" cd "$SCRIPT_DIR" # 检查 Go 环境 check_go() { if ! command -v go > /dev/null 2>&1; then echo -e "${RED}错误: 未找到 Go 环境${NC}" echo -e "${YELLOW}请先安装 Go: https://golang.org/dl/${NC}" exit 1 fi GO_VERSION=$(go version 2>/dev/null | head -1) echo -e "${GREEN}✓ 检测到 Go: ${GO_VERSION}${NC}" } # 配置 Go 环境(海外网络,直接使用官方源) setup_go_env() { echo -e "${BLUE}配置 Go 环境(使用官方源)...${NC}" # 海外网络可以直接使用官方源,无需代理 # 使用官方 Go 代理和校验和数据库 export GOPROXY="https://proxy.golang.org,direct" export GOSUMDB="sum.golang.org" # 使用 go env -w 永久设置 go env -w GOPROXY="https://proxy.golang.org,direct" 2>/dev/null || true go env -w GOSUMDB="sum.golang.org" 2>/dev/null || true echo -e "${GREEN}✓ Go 环境配置完成(使用官方源)${NC}" echo -e "${BLUE} GOPROXY=https://proxy.golang.org,direct${NC}" echo -e "${BLUE} GOSUMDB=sum.golang.org${NC}" } # 下载依赖 download_dependencies() { echo -e "${BLUE}下载 Go 依赖包...${NC}" # 先整理依赖 echo -e "${BLUE}整理 Go 模块依赖...${NC}" if ! go mod tidy -v 2>&1; then echo -e "${YELLOW}⚠ go mod tidy 失败,继续尝试下载依赖...${NC}" fi # 下载依赖 echo -e "${BLUE}下载所有依赖包(这可能需要一些时间)...${NC}" DOWNLOAD_START_TIME=$(date +%s) if go mod download -x 2>&1; then DOWNLOAD_END_TIME=$(date +%s) DOWNLOAD_DURATION=$((DOWNLOAD_END_TIME - DOWNLOAD_START_TIME)) echo -e "${GREEN}✓ 依赖下载完成 (耗时: ${DOWNLOAD_DURATION}秒)${NC}" else echo -e "${RED}✗ 依赖下载失败${NC}" exit 1 fi } # 创建 vendor 目录 create_vendor() { echo -e "${BLUE}创建 vendor 目录(打包所有依赖)...${NC}" # 删除旧的 vendor 目录(如果存在) if [ -d "vendor" ]; then echo -e "${YELLOW}清理旧的 vendor 目录...${NC}" rm -rf vendor fi # 创建 vendor 目录 if go mod vendor -v 2>&1; then VENDOR_COUNT=$(find vendor -type d -mindepth 2 2>/dev/null | wc -l | tr -d '\n' || echo "0") VENDOR_COUNT=${VENDOR_COUNT:-0} # 计算 vendor 目录大小 VENDOR_SIZE=$(du -sh vendor 2>/dev/null | cut -f1 || echo "未知") echo -e "${GREEN}✓ vendor 目录创建成功${NC}" echo -e "${BLUE}统计信息:${NC}" echo -e " 依赖包数量: ${GREEN}${VENDOR_COUNT}${NC}" echo -e " 目录大小: ${GREEN}${VENDOR_SIZE}${NC}" else echo -e "${RED}✗ vendor 创建失败${NC}" exit 1 fi } # 更新 .gitignore update_gitignore() { echo -e "${BLUE}更新 .gitignore...${NC}" if [ ! -f ".gitignore" ]; then echo -e "${BLUE}创建 .gitignore 文件...${NC}" touch .gitignore fi # 检查 .gitignore 是否忽略了 vendor if grep -q "^vendor$" .gitignore 2>/dev/null || grep -q "^vendor/" .gitignore 2>/dev/null; then echo -e "${YELLOW}⚠ 检测到 .gitignore 中忽略了 vendor 目录${NC}" echo -e "${BLUE}正在更新 .gitignore,允许 vendor 目录被提交...${NC}" # 移除 vendor 相关的忽略规则 sed -i.bak '/^vendor$/d; /^vendor\//d' .gitignore 2>/dev/null || \ sed -i '' '/^vendor$/d; /^vendor\//d' .gitignore 2>/dev/null || true rm -f .gitignore.bak 2>/dev/null || true echo -e "${GREEN}✓ 已更新 .gitignore${NC}" else echo -e "${GREEN}✓ .gitignore 配置正确${NC}" fi } # 添加到 Git(可选) add_to_git() { if [ -d ".git" ]; then echo -e "${BLUE}将 vendor 目录添加到 Git...${NC}" # 检查是否有未提交的更改 if git status --porcelain vendor 2>/dev/null | grep -q vendor; then git add vendor/ 2>/dev/null || true echo -e "${GREEN}✓ vendor 目录已添加到 Git 暂存区${NC}" echo -e "${YELLOW}提示: 请运行 'git commit -m \"chore: add vendor dependencies\"' 提交 vendor 目录${NC}" else echo -e "${BLUE}vendor 目录已在 Git 中${NC}" fi else echo -e "${YELLOW}⚠ 当前目录不是 Git 仓库,跳过 Git 操作${NC}" fi } # 显示进度显示 show_progress() { echo -e "${BLUE}正在下载依赖包,显示进度...${NC}" # 使用后台进程显示进度 ( DOWNLOADED_COUNT=0 LAST_COUNT=0 LAST_PACKAGE="" START_TIME=$(date +%s) while true; do sleep 1 # 从 go mod download 的输出中统计 CURRENT_COUNT=$(ps aux | grep -c "[g]o mod download" || echo "0") # 检查进程是否还在运行 if ! pgrep -f "go mod download" > /dev/null 2>&1; then break fi CURRENT_TIME=$(date +%s) ELAPSED=$((CURRENT_TIME - START_TIME)) if [ "$ELAPSED" -gt 0 ]; then echo -ne "\r${BLUE}进度: 下载中... | 耗时: ${ELAPSED}秒 " fi done ) & PROGRESS_PID=$! # 等待下载完成 wait $PROGRESS_PID 2>/dev/null || true } # 主函数 main() { echo -e "${GREEN}========================================${NC}" echo -e "${GREEN} LinkMaster Node Vendor 依赖打包工具${NC}" echo -e "${GREEN}========================================${NC}" echo "" # 检查是否在项目根目录 if [ ! -f "go.mod" ]; then echo -e "${RED}错误: 未找到 go.mod 文件${NC}" echo -e "${YELLOW}请在项目根目录运行此脚本${NC}" exit 1 fi check_go setup_go_env download_dependencies create_vendor update_gitignore add_to_git echo "" echo -e "${GREEN}========================================${NC}" echo -e "${GREEN} ✓ Vendor 依赖打包完成!${NC}" echo -e "${GREEN}========================================${NC}" echo "" echo -e "${BLUE}下一步操作:${NC}" echo " 1. 检查 vendor 目录: ls -lh vendor/" echo " 2. 提交到 Git: git add vendor/ && git commit -m \"chore: add vendor dependencies\"" echo " 3. 推送到远程: git push" echo "" echo -e "${BLUE}客户端使用:${NC}" echo " 客户端克隆项目后,可以使用以下命令编译(无需网络):" echo " go build -mod=vendor -o agent ./cmd/agent" echo "" } # 执行主函数 main