Files
linkmaster-node/vendor.sh
2025-12-03 20:05:47 +08:00

221 lines
7.0 KiB
Bash
Executable File
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#!/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