diff --git a/devcontainer/apt-install-with-cache.sh b/devcontainer/apt-install-with-cache.sh index 8515b56..027e1c4 100644 --- a/devcontainer/apt-install-with-cache.sh +++ b/devcontainer/apt-install-with-cache.sh @@ -6,6 +6,8 @@ # =================配置区域================= # 自定义缓存目录 CACHE_DIR=${APT_CACHE_DIR:-"/vscode/apt-cache"} +# 自动更新间隔 (秒),默认 24 小时 +UPDATE_INTERVAL=${APT_UPDATE_INTERVAL:-86400} # ========================================= START_TIME=$(date +%s) @@ -43,11 +45,31 @@ if [ ! -d "$CACHE_DIR/partial" ]; then $SUDO mkdir -p "$CACHE_DIR/partial" fi -echo "🔄 更新软件源..." -# 自动更新源 -$SUDO apt-get update >> "$LOG_FILE" 2>&1 -if [ $? -ne 0 ]; then - echo "❌ 更新失败,详细日志:" +# 检查上次更新时间 +LAST_UPDATE_FILE="/var/lib/apt/periodic/update-success-stamp" +NOW=$(date +%s) +SHOULD_UPDATE=true + +if [ -f "$LAST_UPDATE_FILE" ]; then + LAST_UPDATE=$(stat -c %Y "$LAST_UPDATE_FILE" 2>/dev/null || stat -f %m "$LAST_UPDATE_FILE" 2>/dev/null) + if [ $((NOW - LAST_UPDATE)) -lt $UPDATE_INTERVAL ]; then + echo "⏩ 软件源在 $(( (NOW - LAST_UPDATE) / 60 )) 分钟前已更新,跳过 update..." + SHOULD_UPDATE=false + fi +fi + +if [ "$SHOULD_UPDATE" = true ]; then + echo "🔄 更新软件源..." + # 自动更新源 + $SUDO apt-get update >> "$LOG_FILE" 2>&1 + if [ $? -ne 0 ]; then + echo "❌ 更新失败,详细日志:" + cat "$LOG_FILE" + exit 1 + fi +fi + +# 2. 第一步:只下载,不安装 (Download Only) cat "$LOG_FILE" exit 1 fi @@ -83,7 +105,15 @@ echo "✅ 依赖下载/缓存完成。" # 再次运行 install,指向同一个缓存目录。 # apt 会检测到目录里已经有对应的 .deb 文件(且哈希值匹配),就会直接使用缓存,跳过下载。 echo "🚀 开始安装..." -$SUDO env DEBIAN_FRONTEND=noninteractive apt-get install --no-install-recommends -y \ + +# 尝试使用 eatmydata 加速安装 (如果可用) +APT_CMD="apt-get" +if command -v eatmydata >/dev/null 2>&1; then + APT_CMD="eatmydata apt-get" + echo "⚡️ 启用 eatmydata 加速" +fi + +$SUDO env DEBIAN_FRONTEND=noninteractive $APT_CMD install --no-install-recommends -y \ -o Dir::Cache::archives="$CACHE_DIR" \ $PACKAGES >> "$LOG_FILE" 2>&1