Files
tools/common/remote_loader.sh
Wang Defa b34e1ef872 feat: 为所有脚本添加远程库加载支持
## 功能概述

实现了智能远程库加载机制,允许脚本从远程 Gitea 仓库动态下载公共库,
同时保留本地库优先的策略,确保脚本可以独立运行而不依赖本地项目结构。

## 变更内容

### 新增文件

- **common/remote_loader.sh**: 核心远程加载器
  - 支持 curl/wget 双重下载方式
  - 临时文件自动清理机制
  - 环境变量可配置仓库 URL

- **examples/remote_example.sh**: 纯远程模式示例
  - 演示完全独立的远程加载脚本
  - 适合单文件分发场景

- **examples/hybrid_loader_template.sh**: 混合模式模板
  - 本地优先 + 远程回退策略
  - 适合仓库内脚本

- **examples/REMOTE_LOADER_README.md**: 完整使用文档
  - 三种使用模式详解
  - 故障排除指南
  - 最佳实践建议

### 更新脚本(版本 2.1.0)

所有主要脚本均升级到 2.1.0 版本,支持智能库加载:

- **linux/create_raid0_array.sh**
- **linux/repartition_disks.sh**
- **linux/install_oh_my_zsh.sh**
- **gcp/create_ai_projects.sh**
- **gcp/delete_all_projects.sh**
- **oci/create_instance.sh**
- **common/demo_usage.sh**

## 加载策略

1. 检查 FORCE_REMOTE=1 环境变量 → 强制远程
2. 检查本地库存在性 → 优先使用本地
3. 本地不存在 → 自动回退远程
4. 远程失败 → 友好错误提示

## 使用示例

### 本地模式(默认)
```bash
./linux/create_raid0_array.sh
```

### 强制远程模式
```bash
FORCE_REMOTE=1 ./linux/create_raid0_array.sh
```

### 自定义仓库 URL
```bash
REMOTE_LIB_URL=https://example.com/repo ./script.sh
```

## 技术特性

-  向后兼容:默认使用本地库,行为不变
-  离线可用:本地库存在时无需网络
-  独立分发:支持单文件脚本分发
-  错误处理:详细的错误信息和诊断建议
-  环境可配:REMOTE_LIB_URL 和 FORCE_REMOTE
-  自动清理:临时文件通过 trap 自动删除
2025-12-26 15:00:06 +08:00

106 lines
2.9 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
# ============================================================================
# 文件名: remote_loader.sh
# 描述: 远程公共库加载器 - 从 Gitea 仓库下载并加载公共库
# 作者: Cloud Tools Project
# 版本: 1.0.0
# ============================================================================
# 远程仓库 URL 配置
readonly REMOTE_BASE_URL="${REMOTE_LIB_URL:-https://gitea.bcde.io/wangdefa/tools/raw/branch/main}"
# 临时目录用于存储下载的文件
readonly REMOTE_TMP_DIR="$(mktemp -d)"
# 清理函数 - 在脚本退出时删除临时文件
cleanup_remote_libs() {
if [[ -d "$REMOTE_TMP_DIR" ]]; then
rm -rf "$REMOTE_TMP_DIR"
fi
}
# 注册退出时的清理函数
trap cleanup_remote_libs EXIT INT TERM
#
# 从远程下载单个文件
#
# 参数:
# $1 - 相对路径例如common/logging.sh
#
# 返回:
# 下载文件的本地路径
#
download_remote_file() {
local relative_path="$1"
local remote_url="${REMOTE_BASE_URL}/${relative_path}"
local local_file="${REMOTE_TMP_DIR}/$(basename "$relative_path")"
# 尝试使用 curl 下载
if command -v curl &>/dev/null; then
if curl -fsSL "$remote_url" -o "$local_file" 2>/dev/null; then
echo "$local_file"
return 0
fi
# 尝试使用 wget 下载
elif command -v wget &>/dev/null; then
if wget -q "$remote_url" -O "$local_file" 2>/dev/null; then
echo "$local_file"
return 0
fi
else
echo "[ERROR] 未找到 curl 或 wget 命令,无法下载远程库" >&2
return 1
fi
echo "[ERROR] 无法下载远程库: $remote_url" >&2
return 1
}
#
# 加载远程公共库
#
# 此函数会下载并 source 所有必需的公共库
#
load_remote_libs() {
echo "[INFO] 正在从远程仓库加载公共库..."
echo "[INFO] 仓库地址: $REMOTE_BASE_URL"
# 必需的库文件列表
local required_libs=(
"common/logging.sh"
"common/error_handler.sh"
)
# 下载并加载每个库文件
for lib in "${required_libs[@]}"; do
echo "[INFO] 下载 $lib ..."
local local_path
if local_path=$(download_remote_file "$lib"); then
echo "[SUCCESS] 已下载: $lib"
# 加载库文件
# shellcheck disable=SC1090
if source "$local_path"; then
echo "[SUCCESS] 已加载: $lib"
else
echo "[ERROR] 无法加载远程库: $lib" >&2
echo "[ERROR] 脚本执行中止" >&2
exit 1
fi
else
echo "[ERROR] 无法下载远程库: $lib" >&2
echo "[ERROR] 脚本执行中止" >&2
echo "[ERROR] 请检查网络连接或仓库 URL: $REMOTE_BASE_URL" >&2
exit 1
fi
done
echo "[SUCCESS] 所有远程库加载完成"
echo ""
}
# 执行加载
load_remote_libs