Files
agent-aide/aide-program/offline-installer/linux/install.sh
sayurinana(vm) ba70fafa15 [aide] finish: 任务完成
新增环境安装 Commands:
- /aide:install-win - Windows 环境安装命令
- /aide:install-linux - Linux 环境安装命令

新增离线安装程序:
- aide-program/offline-installer/windows/
- aide-program/offline-installer/linux/

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-17 05:22:38 +08:00

471 lines
13 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
#
# Aide 离线环境安装脚本 (Linux)
#
# 此脚本从本地资源文件安装 aide 工具所需的环境依赖:
# - uv (Python 包管理器)
# - Java JRE (用于 PlantUML)
#
# 运行前请确保已下载所有必需的资源文件到脚本所在目录。
# 参见 resources.json 获取资源下载链接。
#
# 用法:
# chmod +x install.sh
# ./install.sh [选项]
#
# 选项:
# --aide-path PATH 指定 aide-program 目录路径
# --java-path PATH 指定 Java 安装路径(默认 ~/.local/java/jre-17
# --system-java 使用 /opt/java/jre-17需要 sudo
# --silent 静默安装模式
# --skip-uv 跳过 uv 安装
# --skip-java 跳过 Java 安装
# -h, --help 显示帮助信息
#
# 作者: Aide Team
# 版本: 1.0.0
#
set -e
# ============================================================
# 配置
# ============================================================
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
# 资源文件名
UV_TAR_FILE="uv-x86_64-unknown-linux-gnu.tar.gz"
JAVA_TAR_FILE="OpenJDK17U-jre_x64_linux_hotspot_17.0.9_9.tar.gz"
# 默认安装路径
UV_INSTALL_PATH="$HOME/.local/bin"
JAVA_INSTALL_PATH="$HOME/.local/java/jre-17"
# 默认选项
AIDE_PATH=""
SILENT=false
SKIP_UV=false
SKIP_JAVA=false
SYSTEM_JAVA=false
# ============================================================
# 颜色定义
# ============================================================
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
CYAN='\033[0;36m'
NC='\033[0m' # No Color
# ============================================================
# 辅助函数
# ============================================================
success() { echo -e "${GREEN}${NC} $1"; }
warning() { echo -e "${YELLOW}${NC} $1"; }
error() { echo -e "${RED}${NC} $1"; }
info() { echo -e "${CYAN}${NC} $1"; }
header() {
echo ""
echo -e "${CYAN}========================================${NC}"
echo -e "${CYAN} $1${NC}"
echo -e "${CYAN}========================================${NC}"
echo ""
}
command_exists() {
command -v "$1" >/dev/null 2>&1
}
get_shell_rc() {
case "$(basename "$SHELL")" in
bash) echo "$HOME/.bashrc" ;;
zsh) echo "$HOME/.zshrc" ;;
fish) echo "$HOME/.config/fish/config.fish" ;;
*) echo "$HOME/.profile" ;;
esac
}
add_to_path() {
local path_to_add="$1"
local rc_file
rc_file=$(get_shell_rc)
if [[ "$SHELL" == *"fish"* ]]; then
if ! grep -q "$path_to_add" "$rc_file" 2>/dev/null; then
echo "set -gx PATH \$PATH $path_to_add" >> "$rc_file"
return 0
fi
else
if ! grep -q "$path_to_add" "$rc_file" 2>/dev/null; then
echo "" >> "$rc_file"
echo "# Added by Aide installer" >> "$rc_file"
echo "export PATH=\"\$PATH:$path_to_add\"" >> "$rc_file"
return 0
fi
fi
return 1
}
set_java_home() {
local java_path="$1"
local rc_file
rc_file=$(get_shell_rc)
if [[ "$SHELL" == *"fish"* ]]; then
if ! grep -q "JAVA_HOME" "$rc_file" 2>/dev/null; then
echo "set -gx JAVA_HOME $java_path" >> "$rc_file"
fi
else
if ! grep -q "JAVA_HOME" "$rc_file" 2>/dev/null; then
echo "export JAVA_HOME=\"$java_path\"" >> "$rc_file"
fi
fi
}
show_help() {
echo "用法: $0 [选项]"
echo ""
echo "Aide 离线环境安装脚本 (Linux)"
echo ""
echo "选项:"
echo " --aide-path PATH 指定 aide-program 目录路径"
echo " --java-path PATH 指定 Java 安装路径(默认 ~/.local/java/jre-17"
echo " --system-java 使用 /opt/java/jre-17需要 sudo"
echo " --silent 静默安装模式"
echo " --skip-uv 跳过 uv 安装"
echo " --skip-java 跳过 Java 安装"
echo " -h, --help 显示帮助信息"
echo ""
echo "示例:"
echo " $0 # 交互式安装"
echo " $0 --silent # 静默安装"
echo " $0 --aide-path /path/to/aide # 配置 aide PATH"
echo " $0 --system-java # 安装 Java 到 /opt需要 sudo"
}
# ============================================================
# 解析参数
# ============================================================
while [[ $# -gt 0 ]]; do
case $1 in
--aide-path)
AIDE_PATH="$2"
shift 2
;;
--java-path)
JAVA_INSTALL_PATH="$2"
shift 2
;;
--system-java)
SYSTEM_JAVA=true
JAVA_INSTALL_PATH="/opt/java/jre-17"
shift
;;
--silent)
SILENT=true
shift
;;
--skip-uv)
SKIP_UV=true
shift
;;
--skip-java)
SKIP_JAVA=true
shift
;;
-h|--help)
show_help
exit 0
;;
*)
error "未知选项: $1"
echo "运行 '$0 --help' 查看帮助"
exit 1
;;
esac
done
# ============================================================
# 主逻辑
# ============================================================
header "Aide 离线安装程序 (Linux)"
# 检查资源文件
info "检查资源文件..."
missing_resources=()
if [ "$SKIP_UV" = false ]; then
uv_tar_path="$SCRIPT_DIR/$UV_TAR_FILE"
if [ ! -f "$uv_tar_path" ]; then
missing_resources+=("$UV_TAR_FILE")
fi
fi
if [ "$SKIP_JAVA" = false ]; then
java_tar_path="$SCRIPT_DIR/$JAVA_TAR_FILE"
if [ ! -f "$java_tar_path" ]; then
# 尝试匹配通配符
java_tar_path=$(find "$SCRIPT_DIR" -name "OpenJDK17U-jre_x64_linux_*.tar.gz" 2>/dev/null | head -n 1)
if [ -z "$java_tar_path" ]; then
missing_resources+=("$JAVA_TAR_FILE (或任意 OpenJDK17U-jre_x64_linux_*.tar.gz)")
else
JAVA_TAR_FILE=$(basename "$java_tar_path")
fi
fi
fi
if [ ${#missing_resources[@]} -gt 0 ]; then
error "缺少以下资源文件:"
for resource in "${missing_resources[@]}"; do
echo " - $resource"
done
echo ""
info "请参考 resources.json 下载所需文件后重新运行此脚本"
exit 1
fi
success "所有资源文件已就绪"
# 确认安装
if [ "$SILENT" = false ]; then
echo ""
info "将要安装以下组件:"
if [ "$SKIP_UV" = false ]; then
echo " - uv (Python 包管理器) -> $UV_INSTALL_PATH"
fi
if [ "$SKIP_JAVA" = false ]; then
echo " - Java JRE 17 -> $JAVA_INSTALL_PATH"
fi
echo ""
read -p "是否继续? (Y/n) " -n 1 -r
echo
if [[ $REPLY =~ ^[Nn]$ ]]; then
info "安装已取消"
exit 0
fi
fi
# ============================================================
# 安装 uv
# ============================================================
if [ "$SKIP_UV" = false ]; then
echo ""
info "安装 uv..."
if command_exists uv; then
uv_version=$(uv --version 2>&1)
success "uv 已安装: $uv_version"
else
uv_tar_path="$SCRIPT_DIR/$UV_TAR_FILE"
# 创建安装目录
mkdir -p "$UV_INSTALL_PATH"
# 解压
info "解压 uv..."
temp_dir=$(mktemp -d)
tar -xzf "$uv_tar_path" -C "$temp_dir"
# 查找并复制 uv 可执行文件
uv_exe=$(find "$temp_dir" -name "uv" -type f | head -n 1)
if [ -n "$uv_exe" ]; then
cp "$uv_exe" "$UV_INSTALL_PATH/"
chmod +x "$UV_INSTALL_PATH/uv"
# 同时复制 uvx如果存在
uvx_exe=$(find "$temp_dir" -name "uvx" -type f | head -n 1)
if [ -n "$uvx_exe" ]; then
cp "$uvx_exe" "$UV_INSTALL_PATH/"
chmod +x "$UV_INSTALL_PATH/uvx"
fi
success "uv 已解压到 $UV_INSTALL_PATH"
else
error "在压缩包中找不到 uv 可执行文件"
rm -rf "$temp_dir"
exit 1
fi
# 清理临时目录
rm -rf "$temp_dir"
# 添加到 PATH
if add_to_path "$UV_INSTALL_PATH"; then
success "已添加 $UV_INSTALL_PATH 到 PATH"
else
info "uv 路径已在 shell 配置中"
fi
# 更新当前会话的 PATH
export PATH="$PATH:$UV_INSTALL_PATH"
# 验证
if command_exists uv; then
success "uv 安装成功"
else
warning "uv 安装完成,但需要重启终端或运行 'source $(get_shell_rc)'"
fi
fi
fi
# ============================================================
# 安装 Java JRE
# ============================================================
if [ "$SKIP_JAVA" = false ]; then
echo ""
info "安装 Java JRE..."
if command_exists java; then
java_version=$(java -version 2>&1 | head -n 1)
success "Java 已安装: $java_version"
else
java_tar_path="$SCRIPT_DIR/$JAVA_TAR_FILE"
# 创建安装目录
if [ "$SYSTEM_JAVA" = true ]; then
sudo mkdir -p "$(dirname "$JAVA_INSTALL_PATH")"
else
mkdir -p "$(dirname "$JAVA_INSTALL_PATH")"
fi
# 解压
info "解压 Java JRE..."
temp_dir=$(mktemp -d)
tar -xzf "$java_tar_path" -C "$temp_dir"
# 查找解压后的 JRE 目录
jre_dir=$(find "$temp_dir" -maxdepth 1 -type d -name "jdk-*-jre" | head -n 1)
if [ -z "$jre_dir" ]; then
jre_dir=$(find "$temp_dir" -maxdepth 1 -type d | tail -n 1)
fi
if [ -n "$jre_dir" ] && [ "$jre_dir" != "$temp_dir" ]; then
# 移动到目标位置
if [ "$SYSTEM_JAVA" = true ]; then
sudo rm -rf "$JAVA_INSTALL_PATH" 2>/dev/null || true
sudo mv "$jre_dir" "$JAVA_INSTALL_PATH"
else
rm -rf "$JAVA_INSTALL_PATH" 2>/dev/null || true
mv "$jre_dir" "$JAVA_INSTALL_PATH"
fi
success "Java JRE 已安装到 $JAVA_INSTALL_PATH"
else
error "在压缩包中找不到 JRE 目录"
rm -rf "$temp_dir"
exit 1
fi
# 清理临时目录
rm -rf "$temp_dir"
# 配置 JAVA_HOME
set_java_home "$JAVA_INSTALL_PATH"
export JAVA_HOME="$JAVA_INSTALL_PATH"
info "已设置 JAVA_HOME = $JAVA_INSTALL_PATH"
# 添加到 PATH
java_bin_path="$JAVA_INSTALL_PATH/bin"
if add_to_path "$java_bin_path"; then
success "已添加 Java bin 到 PATH"
else
info "Java bin 路径已在 shell 配置中"
fi
# 更新当前会话的 PATH
export PATH="$PATH:$java_bin_path"
# 创建符号链接(仅系统安装)
if [ "$SYSTEM_JAVA" = true ]; then
sudo ln -sf "$java_bin_path/java" /usr/local/bin/java 2>/dev/null || true
fi
# 验证
if command_exists java; then
java_version=$(java -version 2>&1 | head -n 1)
success "Java 安装成功: $java_version"
else
warning "Java 安装完成,但需要重启终端或运行 'source $(get_shell_rc)'"
fi
fi
fi
# ============================================================
# 安装 Python (通过 uv)
# ============================================================
echo ""
info "配置 Python..."
if command_exists uv; then
python_list=$(uv python list 2>&1 || true)
if echo "$python_list" | grep -q "3\."; then
success "Python 已通过 uv 安装"
else
info "通过 uv 安装 Python 3.11..."
if uv python install 3.11 2>/dev/null; then
success "Python 3.11 安装成功"
else
warning "Python 安装需要网络连接,请稍后手动运行: uv python install 3.11"
fi
fi
else
warning "uv 不可用,无法安装 Python。请重启终端后运行: uv python install 3.11"
fi
# ============================================================
# 配置 aide PATH
# ============================================================
if [ -n "$AIDE_PATH" ]; then
echo ""
info "配置 aide PATH..."
aide_bin_path="$AIDE_PATH/bin"
if [ -d "$aide_bin_path" ]; then
if add_to_path "$aide_bin_path"; then
success "已添加 aide 到 PATH: $aide_bin_path"
else
info "aide 已在 PATH 中"
fi
export PATH="$PATH:$aide_bin_path"
else
warning "aide-program/bin 目录不存在: $aide_bin_path"
fi
fi
# ============================================================
# 完成
# ============================================================
header "安装完成"
info "已安装组件:"
if command_exists uv; then
echo -e " ${GREEN}${NC} uv: $(uv --version 2>&1)"
else
echo -e " ${YELLOW}${NC} uv: 需要重启终端"
fi
if command_exists java; then
echo -e " ${GREEN}${NC} Java: $(java -version 2>&1 | head -n 1)"
else
echo -e " ${YELLOW}${NC} Java: 需要重启终端"
fi
echo ""
info "下一步:"
echo " 1. 重启终端或运行: source $(get_shell_rc)"
echo " 2. 运行 'uv python install 3.11' 安装 Python如尚未安装"
echo " 3. 运行 'aide env ensure --runtime' 验证安装"
echo ""