Skip to content

Commit d6c5897

Browse files
author
ISHAOHAO
committed
feat: 添加了全球镜像源支持选择的功能
1 parent 89ecd13 commit d6c5897

4 files changed

Lines changed: 461 additions & 330 deletions

File tree

CHANGELOG.md

Lines changed: 14 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -5,28 +5,22 @@
55
格式基于 [Keep a Changelog](https://keepachangelog.com/zh-CN/1.0.0/),版本遵循 [语义化版本](https://semver.org/lang/zh-CN/)
66

77
## [Unreleased]
8+
89
### 新增
9-
- 初始项目结构搭建
10-
- 系统检测模块:自动识别发行版、包管理器、WSL 环境、网络连通性
11-
- DNS 优化模块:支持 systemd-resolved 和 /etc/resolv.conf,提供阿里、腾讯、Cloudflare 等公共 DNS 选项,自动备份
12-
- 系统镜像优化模块:支持 apt、yum/dnf、pacman、brew,提供中国大陆(阿里、清华、中科大、华为云等)、海外镜像源,支持恢复官方源
13-
- 开发工具镜像优化模块:为 npm、pnpm、yarn、pip、docker 配置国内镜像
14-
- GitHub 访问优化模块:更新 hosts 或设置代理环境变量(需用户确认)
15-
- 回滚功能:基于备份清单,支持按序号或全部回滚
16-
- 日志系统:记录所有操作,便于排查
17-
- 多语言支持:中文/英文双语,通过 `--lang` 切换
18-
- 彩色输出:优化用户体验
19-
- 命令行参数:支持 `--yes``--dry-run`、指定模块运行等
20-
- 模块化设计:所有功能独立存放于 `modules/`,便于扩展
21-
- 轻量版脚本 `ChangeMirrorsLite.sh`:仅含系统镜像优化功能
22-
- GitHub Actions 持续集成:ShellCheck 检查、多发行版容器测试
23-
- 单元测试框架(bats)及基础测试用例
10+
- **全球镜像源数据库**:按大洲/国家分类,覆盖亚洲(中国及东亚/东南亚)、欧洲、北美洲、南美洲、大洋洲、非洲,总计超过100个镜像站。
11+
- **地区选择菜单**:在系统镜像优化模块中,用户可先选择地区,再选择具体镜像源,提供更便捷的浏览体验。
12+
- **国家分组显示**:在地区内按国家分组展示镜像,方便用户快速定位。
13+
- **协议选择**:当镜像源同时支持http/https时,允许用户选择协议。
14+
- **命令行快捷指定镜像**:支持 `--mirror` 参数直接使用镜像域名或预定义名称(如 `aliyun`)。
15+
- **多语言支持**:完善中文/英文双语界面,新增语言选择提示(交互模式下未指定语言则询问)。
2416

2517
### 修复
26-
- 修复 Debian 系统下因缺少 lsb_release 导致的代号获取失败
27-
- 修复模块发现函数因注释缺失导致的空菜单
28-
- 修复 `system_mirror.sh` 中未定义变量错误
18+
- **数组引用错误**:修复 `select_mirror_from_region` 函数中间接引用数组只取第一个元素的问题,使用 `eval` 安全展开数组。
19+
- **apply_mirror 参数调用**:修正了从 `run_system_mirror` 调用 `apply_mirror` 时的参数顺序,确保镜像名称正确传递。
20+
- **远程执行时函数定义顺序**:调整主脚本结构,确保所有函数在 `main` 调用前定义,避免 `command not found` 错误。
21+
- **颜色变量未定义问题**:在 `system_mirror.sh` 中添加默认颜色定义,以防 `common.sh` 未加载颜色。
2922

3023
### 变更
31-
- 增强备份/回滚机制,支持按时间点选择
32-
- 改进模块元数据,为插件系统做准备
24+
- **镜像源数据结构**:统一使用 `地区|国家|名称|域名|协议|备注` 格式,便于扩展和维护。
25+
- **地区选择逻辑**:由单一源列表改为分层选择,提升用户体验。
26+
- **交互流程优化**:在未指定语言且为交互模式时,自动询问用户选择语言。

README.md

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,20 @@ sudo ./install.sh --system-mirror --mirror aliyun --lang zh -y
5454

5555
---
5656

57+
### 🌐 全球镜像源支持
58+
59+
devboost 现已集成全球数百个开源镜像站,按地区分类:
60+
61+
- **中国大陆**:阿里云、腾讯云、华为云、清华大学、中科大、上海交大、北京大学等 20+ 镜像源
62+
- **亚太地区**:新加坡、日本、韩国、澳大利亚、新西兰、印度等国家和地区的镜像源
63+
- **欧洲**:德国、法国、英国、荷兰、瑞典、芬兰、瑞士等 30+ 镜像源
64+
- **美洲**:美国 MIT、普林斯顿、UCSC、Liquid Web、Nexcess 等,以及加拿大、巴西、阿根廷镜像源
65+
- **非洲及中东**:南非、肯尼亚、毛里求斯、土耳其等镜像源
66+
67+
系统会自动根据您的发行版过滤不兼容的镜像源,确保配置正确有效。
68+
69+
---
70+
5771
## 📚 使用说明
5872

5973
### 交互式菜单

install.sh

Lines changed: 22 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,6 @@ REQUIRED_MODULES=(
2525

2626
# 判断是否在管道执行(远程模式)
2727
is_pipe_execution() {
28-
# 如果 $0 包含 /dev/fd/ 或标准输入不是终端,则认为是在管道执行
2928
[[ "$0" == *"/dev/fd/"* ]] || [[ ! -t 0 ]]
3029
}
3130

@@ -46,42 +45,36 @@ download_file() {
4645
# 远程模式:创建临时目录并下载所有必要文件
4746
setup_remote_environment() {
4847
echo "检测到远程执行模式,正在准备环境..."
49-
# 创建临时目录
5048
TEMP_DIR=$(mktemp -d -t devboost.XXXXXX)
5149
export DEVBOOST_ROOT="$TEMP_DIR"
5250
export DEVBOOST_BACKUP_DIR="$TEMP_DIR/backups"
5351
export DEVBOOST_LOG_DIR="$TEMP_DIR/logs"
5452
export DEVBOOST_LOG_FILE="$DEVBOOST_LOG_DIR/devboost.log"
5553
export DEVBOOST_MANIFEST="$DEVBOOST_BACKUP_DIR/manifest.txt"
5654

57-
# 创建必要的子目录
5855
mkdir -p "$DEVBOOST_ROOT/lib" "$DEVBOOST_ROOT/modules" \
5956
"$DEVBOOST_BACKUP_DIR" "$DEVBOOST_LOG_DIR"
6057

61-
# 下载 lib 文件
6258
for lib in "${REQUIRED_LIBS[@]}"; do
6359
local filename=$(basename "$lib")
6460
echo "下载 $lib ..."
6561
download_file "$GITHUB_RAW_BASE/$lib" "$DEVBOOST_ROOT/lib/$filename"
6662
done
6763

68-
# 下载 modules 文件
6964
for mod in "${REQUIRED_MODULES[@]}"; do
7065
local filename=$(basename "$mod")
7166
echo "下载 $mod ..."
7267
download_file "$GITHUB_RAW_BASE/$mod" "$DEVBOOST_ROOT/modules/$filename"
7368
done
7469

7570
echo "环境准备完成,临时目录: $TEMP_DIR"
76-
# 注册退出时清理临时目录
7771
trap 'rm -rf "$TEMP_DIR"' EXIT
7872
}
7973

80-
# 确定项目根目录(必须在加载任何库之前执行)
74+
# 确定项目根目录
8175
if is_pipe_execution; then
8276
setup_remote_environment
8377
else
84-
# 本地执行模式:使用脚本所在目录
8578
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
8679
export DEVBOOST_ROOT="$SCRIPT_DIR"
8780
export DEVBOOST_BACKUP_DIR="$DEVBOOST_ROOT/backups"
@@ -90,7 +83,7 @@ else
9083
export DEVBOOST_MANIFEST="$DEVBOOST_BACKUP_DIR/manifest.txt"
9184
fi
9285

93-
# 现在 DEVBOOST_ROOT 已确定,加载公共库
86+
# 加载公共库
9487
source "$DEVBOOST_ROOT/lib/common.sh"
9588

9689
# ---------- 全局变量 ----------
@@ -104,7 +97,20 @@ OPT_LANG="en"
10497
OPT_DRY_RUN=false
10598

10699
# ---------- 函数定义 ----------
107-
# 初始化环境(创建目录、检测系统)
100+
101+
# 询问用户选择语言
102+
ask_language() {
103+
echo "Please select language / 请选择语言:"
104+
echo "1) English"
105+
echo "2) 中文"
106+
read -rp "Choice [1-2]: " lang_choice
107+
case "$lang_choice" in
108+
2) OPT_LANG="zh" ;;
109+
*) OPT_LANG="en" ;;
110+
esac
111+
}
112+
113+
# 初始化环境
108114
init_environment() {
109115
mkdir -p "$DEVBOOST_BACKUP_DIR" "$DEVBOOST_LOG_DIR"
110116
touch "$DEVBOOST_LOG_FILE"
@@ -114,16 +120,14 @@ init_environment() {
114120
log_info "日志文件: $DEVBOOST_LOG_FILE"
115121
log_info "备份目录: $DEVBOOST_BACKUP_DIR"
116122

117-
# 设置语言环境变量(供模块使用)
118123
export DEVBOOST_LANG="$OPT_LANG"
119124

120-
# 加载系统检测结果
121125
source "$DEVBOOST_ROOT/lib/detect.sh"
122126
detect_system
123127
log_info "系统信息: OS=$OS_NAME, ENV=$ENV_TYPE, PKG_MGR=$PKG_MANAGER, NETWORK=$NETWORK_STATUS"
124128
}
125129

126-
# 显示主菜单(交互模式)
130+
# 显示主菜单
127131
show_menu() {
128132
echo ""
129133
if [[ "$OPT_LANG" == "zh" ]]; then
@@ -150,9 +154,7 @@ show_menu() {
150154
done < <(discover_modules)
151155

152156
local module_count=${#module_names[@]}
153-
# 添加“全部执行”选项
154157
echo "$((module_count+1))) $(_echo "Run All" "全部执行")"
155-
# 添加“退出”选项
156158
echo "0) $(_echo "Exit" "退出")"
157159
echo "========================================"
158160
read -rp "$(_echo "Please select [0-$((module_count+1))]: " "请选择 [0-$((module_count+1))]:") " choice
@@ -181,11 +183,9 @@ run_module() {
181183

182184
log_info "开始运行模块: $module"
183185

184-
# 导出 OPT_* 变量,供模块使用
185186
export OPT_MIRROR OPT_PROTOCOL OPT_BRANCH OPT_COMPONENTS
186187

187188
source "$module_script"
188-
# 每个模块必须实现 run_${module} 函数
189189
if declare -f "run_${module}" >/dev/null; then
190190
"run_${module}"
191191
else
@@ -321,6 +321,11 @@ done
321321

322322
# ---------- 主流程 ----------
323323
main() {
324+
# 交互模式下,如果没有指定语言且非自动确认,则询问语言
325+
if [[ -z "$SPECIFIC_MODULE" && "$OPT_LANG" == "en" && "$AUTO_CONFIRM" == false ]]; then
326+
ask_language
327+
fi
328+
324329
init_environment
325330

326331
if [[ "$SPECIFIC_MODULE" == "rollback" ]]; then

0 commit comments

Comments
 (0)