221 lines
7.0 KiB
Bash
Executable File
221 lines
7.0 KiB
Bash
Executable File
#!/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
|
||
|