@@ -77,6 +77,33 @@ setup_remote_environment() {
7777 trap ' rm -rf "$TEMP_DIR"' EXIT
7878}
7979
80+ # 确定项目根目录(必须在加载任何库之前执行)
81+ if is_pipe_execution; then
82+ setup_remote_environment
83+ else
84+ # 本地执行模式:使用脚本所在目录
85+ SCRIPT_DIR=" $( cd " $( dirname " ${BASH_SOURCE[0]} " ) " && pwd) "
86+ export DEVBOOST_ROOT=" $SCRIPT_DIR "
87+ export DEVBOOST_BACKUP_DIR=" $DEVBOOST_ROOT /backups"
88+ export DEVBOOST_LOG_DIR=" $DEVBOOST_ROOT /logs"
89+ export DEVBOOST_LOG_FILE=" $DEVBOOST_LOG_DIR /devboost.log"
90+ export DEVBOOST_MANIFEST=" $DEVBOOST_BACKUP_DIR /manifest.txt"
91+ fi
92+
93+ # 现在 DEVBOOST_ROOT 已确定,加载公共库
94+ source " $DEVBOOST_ROOT /lib/common.sh"
95+
96+ # ---------- 全局变量 ----------
97+ AUTO_CONFIRM=false
98+ SPECIFIC_MODULE=" "
99+ OPT_MIRROR=" "
100+ OPT_PROTOCOL=" https"
101+ OPT_BRANCH=" "
102+ OPT_COMPONENTS=" "
103+ OPT_LANG=" en"
104+ OPT_DRY_RUN=false
105+
106+ # ---------- 函数定义 ----------
80107# 初始化环境(创建目录、检测系统)
81108init_environment () {
82109 mkdir -p " $DEVBOOST_BACKUP_DIR " " $DEVBOOST_LOG_DIR "
@@ -96,45 +123,208 @@ init_environment() {
96123 log_info " 系统信息: OS=$OS_NAME , ENV=$ENV_TYPE , PKG_MGR=$PKG_MANAGER , NETWORK=$NETWORK_STATUS "
97124}
98125
99- # 主流程
100- main () {
101- # 确定项目根目录
102- if is_pipe_execution; then
103- # 远程执行模式:自动下载依赖到临时目录
104- setup_remote_environment
126+ # 显示主菜单(交互模式)
127+ show_menu () {
128+ echo " "
129+ if [[ " $OPT_LANG " == " zh" ]]; then
130+ echo " ========== devboost 优化工具 =========="
131+ else
132+ echo " ========== devboost Optimizer =========="
133+ fi
134+
135+ local i=1
136+ local -a module_names=()
137+ local -a module_descs=()
138+ local -a module_descs_zh=()
139+
140+ while IFS=' |' read -r name desc zh; do
141+ module_names[$i ]=" $name "
142+ module_descs[$i ]=" $desc "
143+ module_descs_zh[$i ]=" $zh "
144+ if [[ " $OPT_LANG " == " zh" ]]; then
145+ printf " %d. %s\n" " $i " " ${zh:- $name } "
146+ else
147+ printf " %d. %s\n" " $i " " ${desc:- $name } "
148+ fi
149+ (( i++ ))
150+ done < <( discover_modules)
151+
152+ local module_count=${# module_names[@]}
153+ # 添加“全部执行”选项
154+ echo " $(( module_count+ 1 )) ) $( _echo " Run All" " 全部执行" ) "
155+ # 添加“退出”选项
156+ echo " 0) $( _echo " Exit" " 退出" ) "
157+ echo " ========================================"
158+ read -rp " $( _echo " Please select [0-$(( module_count+ 1 )) ]: " " 请选择 [0-$(( module_count+ 1 )) ]:" ) " choice
159+
160+ if [[ " $choice " == " 0" ]]; then
161+ exit 0
162+ elif [[ " $choice " -le $module_count ]]; then
163+ run_module " ${module_names[$choice]} "
164+ elif [[ " $choice " -eq $(( module_count+ 1 )) ]]; then
165+ run_all
166+ else
167+ _echo " Invalid choice." " 无效选择。"
168+ show_menu
169+ fi
170+ }
171+
172+ # 运行指定模块
173+ run_module () {
174+ local module=" $1 "
175+ local module_script=" $DEVBOOST_ROOT /modules/${module} .sh"
176+
177+ if [[ ! -f " $module_script " ]]; then
178+ log_error " 模块脚本不存在: $module_script "
179+ exit 1
180+ fi
181+
182+ log_info " 开始运行模块: $module "
183+
184+ # 导出 OPT_* 变量,供模块使用
185+ export OPT_MIRROR OPT_PROTOCOL OPT_BRANCH OPT_COMPONENTS
186+
187+ source " $module_script "
188+ # 每个模块必须实现 run_${module} 函数
189+ if declare -f " run_${module} " > /dev/null; then
190+ " run_${module} "
105191 else
106- # 本地执行模式:使用脚本所在目录
107- SCRIPT_DIR=" $( cd " $( dirname " ${BASH_SOURCE[0]} " ) " && pwd) "
108- export DEVBOOST_ROOT=" $SCRIPT_DIR "
109- export DEVBOOST_BACKUP_DIR=" $DEVBOOST_ROOT /backups"
110- export DEVBOOST_LOG_DIR=" $DEVBOOST_ROOT /logs"
111- export DEVBOOST_LOG_FILE=" $DEVBOOST_LOG_DIR /devboost.log"
112- export DEVBOOST_MANIFEST=" $DEVBOOST_BACKUP_DIR /manifest.txt"
192+ log_error " 模块 $module 缺少入口函数 run_${module} "
193+ exit 1
194+ fi
195+ }
196+
197+ # 全部执行
198+ run_all () {
199+ local modules=()
200+ while IFS=' |' read -r name desc zh; do
201+ modules+=(" $name " )
202+ done < <( discover_modules)
203+
204+ if [[ ${# modules[@]} -eq 0 ]]; then
205+ _echo " No modules found to run." " 没有找到可运行的模块。"
206+ return
113207 fi
114208
115- # 加载公共库(现在 DEVBOOST_ROOT 已正确设置)
116- source " $DEVBOOST_ROOT /lib/common.sh"
209+ for mod in " ${modules[@]} " ; do
210+ echo " "
211+ if ! confirm " $( _echo " Run $mod optimization?" " 是否执行 $mod 优化?" ) " ; then
212+ log_info " 用户跳过模块: $mod "
213+ continue
214+ fi
215+ run_module " $mod "
216+ done
217+ log_info " 全部模块执行完毕。"
218+ }
117219
118- # 全局变量
119- AUTO_CONFIRM=false
120- SPECIFIC_MODULE=" "
121- OPT_MIRROR=" "
122- OPT_PROTOCOL=" https"
123- OPT_BRANCH=" "
124- OPT_COMPONENTS=" "
125- OPT_LANG=" en"
126- OPT_DRY_RUN=false
220+ # 回滚操作
221+ rollback () {
222+ source " $DEVBOOST_ROOT /lib/rollback.sh"
223+ perform_rollback
224+ }
127225
128- # 解析命令行参数(此部分与之前相同,请保留原有解析代码)
129- # ...(从你提供的代码中复制整个 while 循环和 case 语句到这里)
130- # 注意:需要确保解析部分在 source common.sh 之后,因为要用到 log_error 等函数
226+ # ---------- 参数解析 ----------
227+ while [[ $# -gt 0 ]]; do
228+ case " $1 " in
229+ -y|--yes)
230+ AUTO_CONFIRM=true
231+ shift
232+ ;;
233+ --dns)
234+ SPECIFIC_MODULE=" dns"
235+ shift
236+ ;;
237+ --system-mirror)
238+ SPECIFIC_MODULE=" system_mirror"
239+ shift
240+ ;;
241+ --devtools-mirror)
242+ SPECIFIC_MODULE=" devtools_mirror"
243+ shift
244+ ;;
245+ --github)
246+ SPECIFIC_MODULE=" github"
247+ shift
248+ ;;
249+ --rollback)
250+ SPECIFIC_MODULE=" rollback"
251+ shift
252+ ;;
253+ --mirror)
254+ if [[ -z " $2 " || " $2 " == -* ]]; then
255+ echo " 错误: --mirror 需要参数"
256+ exit 1
257+ fi
258+ OPT_MIRROR=" $2 "
259+ shift 2
260+ ;;
261+ --protocol)
262+ if [[ -z " $2 " || " $2 " == -* ]]; then
263+ echo " 错误: --protocol 需要参数"
264+ exit 1
265+ fi
266+ OPT_PROTOCOL=" $2 "
267+ shift 2
268+ ;;
269+ --branch)
270+ if [[ -z " $2 " || " $2 " == -* ]]; then
271+ echo " 错误: --branch 需要参数"
272+ exit 1
273+ fi
274+ OPT_BRANCH=" $2 "
275+ shift 2
276+ ;;
277+ --components)
278+ if [[ -z " $2 " || " $2 " == -* ]]; then
279+ echo " 错误: --components 需要参数"
280+ exit 1
281+ fi
282+ OPT_COMPONENTS=" $2 "
283+ shift 2
284+ ;;
285+ --lang)
286+ if [[ -z " $2 " || " $2 " == -* ]]; then
287+ echo " 错误: --lang 需要参数"
288+ exit 1
289+ fi
290+ OPT_LANG=" $2 "
291+ shift 2
292+ ;;
293+ --dry-run)
294+ OPT_DRY_RUN=true
295+ shift
296+ ;;
297+ -h|--help)
298+ echo " 用法: ./install.sh [选项]"
299+ echo " 选项:"
300+ echo " -y, --yes 自动确认所有提示"
301+ echo " --dns 仅运行DNS优化模块"
302+ echo " --system-mirror 仅运行系统镜像优化模块"
303+ echo " --devtools-mirror 仅运行开发工具镜像优化模块"
304+ echo " --github 仅运行GitHub访问优化模块"
305+ echo " --rollback 执行回滚操作"
306+ echo " --mirror <名称/URL> 指定镜像站(如 aliyun, tuna 或直接输入URL)"
307+ echo " --protocol <http|https> 指定协议(默认 https)"
308+ echo " --branch <分支> 指定仓库分支(如 updates, security)"
309+ echo " --components <组件> 指定组件列表(如 main contrib non-free)"
310+ echo " --lang <zh|en> 设置语言(默认 en)"
311+ echo " --dry-run 模拟运行,不实际修改任何文件"
312+ echo " -h, --help 显示此帮助"
313+ exit 0
314+ ;;
315+ * )
316+ log_error " 未知参数: $1 "
317+ exit 1
318+ ;;
319+ esac
320+ done
131321
132- # 初始化环境
322+ # ---------- 主流程 ----------
323+ main () {
133324 init_environment
134325
135326 if [[ " $SPECIFIC_MODULE " == " rollback" ]]; then
136- source " $DEVBOOST_ROOT /lib/rollback.sh"
137- perform_rollback
327+ rollback
138328 exit 0
139329 fi
140330
@@ -147,5 +337,4 @@ main() {
147337 log_info " ========== devboost 结束 =========="
148338}
149339
150- # 启动主流程
151- main " $@ "
340+ main
0 commit comments