脚本
This commit is contained in:
220
vendor.sh
Executable file
220
vendor.sh
Executable file
@@ -0,0 +1,220 @@
|
||||
#!/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
|
||||
|
||||
Reference in New Issue
Block a user