#!/usr/bin/env bash set -euo pipefail # 永远从脚本所在目录运行(避免在别的目录执行导致 requirements/.env/venv 路径错误) SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" cd "$SCRIPT_DIR" # 函数:加载 .env 文件中的变量 load_env_file() { local env_file=".env" if [ -f "$env_file" ]; then while IFS='=' read -r key value; do # 跳过注释和空行 [[ "$key" =~ ^#.*$ ]] && continue [[ -z "$key" ]] && continue # 移除值两端的引号(如果有) value=$(echo "$value" | sed 's/^["'\'']//' | sed 's/["'\'']$//') # 导出变量 export "$key=$value" done < "$env_file" fi } echo "🔧 X-Request 框架环境设置" echo "==========================" # 检查当前操作系统 # 首先检查是否是Windows环境 if [[ "$OSTYPE" == "msys" || "$OSTYPE" == "cygwin" || "$OSTYPE" == "win32" ]]; then OS_TYPE="Windows" PYTHON_CMD="python" elif [[ "$OSTYPE" == "linux-gnu"* ]]; then OS_TYPE="Linux" PYTHON_CMD="python3" elif [[ "$OSTYPE" == "darwin"* ]]; then OS_TYPE="macOS" PYTHON_CMD="python3" else # 使用uname作为后备检测 OS_TYPE="$(uname -s)" if [[ "$OS_TYPE" == *"Windows"* || "$OS_TYPE" == "MSYS"* || "$OS_TYPE" == "MINGW"* ]]; then OS_TYPE="Windows" PYTHON_CMD="python" else PYTHON_CMD="python3" fi fi # 额外检查是否在Windows PowerShell或CMD中运行 if [[ "$SHELL" == *"powershell"* || "$SHELL" == *"cmd.exe"* ]]; then OS_TYPE="Windows" PYTHON_CMD="python" fi # 检查是否存在python.exe文件(Windows特有) if [[ -f "$(which python.exe 2>/dev/null)" ]]; then OS_TYPE="Windows" PYTHON_CMD="python.exe" fi echo "📋 检测到操作系统: $OS_TYPE" echo "📋 使用Python命令: $PYTHON_CMD" # 检查Python版本 echo "📋 检查Python版本..." python_version=$($PYTHON_CMD --version 2>&1 | grep -Po '(?<=Python )\d+\.\d+') if [ -z "$python_version" ]; then python_version=$($PYTHON_CMD --version 2>&1 | awk '{print $2}' | cut -d'.' -f1,2) fi echo "✅ 发现Python: $python_version" # 简单的版本比较(不需要bc命令) major_version=$(echo $python_version | cut -d'.' -f1) minor_version=$(echo $python_version | cut -d'.' -f2) if [ "$major_version" -lt 3 ] || ([ "$major_version" -eq 3 ] && [ "$minor_version" -lt 8 ]); then echo "❌ 需要 Python 3.8 或更高版本,当前版本: $python_version" exit 1 fi echo "✅ Python版本检查通过" # 检查虚拟环境是否存在且完整 VENV_COMPLETE=false if [ -d "xrequest" ]; then # 检查激活脚本是否存在 if [ -f "xrequest/Scripts/activate" ] || [ -f "xrequest/bin/activate" ]; then echo "✅ 虚拟环境已存在且完整" VENV_COMPLETE=true else echo "⚠️ 虚拟环境存在但不完整,删除并重新创建..." rm -rf xrequest fi fi # 如果虚拟环境不存在或不完整,创建新的虚拟环境 if [ "$VENV_COMPLETE" = false ]; then echo "📦 创建虚拟环境..." # 根据操作系统类型选择不同的虚拟环境创建方式 if [ "$OS_TYPE" = "Windows" ]; then # 在Windows上使用python -m venv $PYTHON_CMD -m venv xrequest if [ $? -eq 0 ]; then # 检查虚拟环境是否创建成功 if [ -f "xrequest/Scripts/activate" ]; then echo "✅ 虚拟环境创建完成" else echo "⚠️ 虚拟环境创建可能失败,尝试使用pip创建..." # 如果venv创建失败,尝试使用pip安装virtualenv并创建虚拟环境 $PYTHON_CMD -m pip install --user virtualenv $PYTHON_CMD -m virtualenv xrequest if [ $? -eq 0 ]; then if [ -f "xrequest/Scripts/activate" ]; then echo "✅ 虚拟环境创建完成(使用virtualenv)" else echo "❌ 虚拟环境创建失败,请手动创建虚拟环境" echo " 手动创建方法:" echo " 1. 安装virtualenv:pip install virtualenv" echo " 2. 创建虚拟环境:virtualenv xrequest" echo " 3. 激活虚拟环境:xrequest/Scripts/activate" echo " 4. 安装依赖:pip install -r requirements.txt" fi else echo "❌ 虚拟环境创建失败,请手动创建虚拟环境" echo " 手动创建方法:" echo " 1. 安装virtualenv:pip install virtualenv" echo " 2. 创建虚拟环境:virtualenv xrequest" echo " 3. 激活虚拟环境:xrequest/Scripts/activate" echo " 4. 安装依赖:pip install -r requirements.txt" fi fi else echo "❌ 虚拟环境创建失败,请手动创建虚拟环境" echo " 手动创建方法:" echo " 1. 安装virtualenv:pip install virtualenv" echo " 2. 创建虚拟环境:virtualenv xrequest" echo " 3. 激活虚拟环境:xrequest/Scripts/activate" echo " 4. 安装依赖:pip install -r requirements.txt" fi else # 在Linux/Mac上使用python3 -m venv $PYTHON_CMD -m venv xrequest if [ $? -eq 0 ]; then # 检查虚拟环境是否创建成功 if [ -f "xrequest/bin/activate" ]; then echo "✅ 虚拟环境创建完成" else echo "⚠️ 虚拟环境创建可能失败,尝试使用pip创建..." # 如果venv创建失败,尝试使用pip安装virtualenv并创建虚拟环境 $PYTHON_CMD -m pip install --user virtualenv $PYTHON_CMD -m virtualenv xrequest if [ $? -eq 0 ]; then if [ -f "xrequest/bin/activate" ]; then echo "✅ 虚拟环境创建完成(使用virtualenv)" else echo "❌ 虚拟环境创建失败,请手动创建虚拟环境" echo " 手动创建方法:" echo " 1. 安装virtualenv:pip install virtualenv" echo " 2. 创建虚拟环境:virtualenv xrequest" echo " 3. 激活虚拟环境:source xrequest/bin/activate" echo " 4. 安装依赖:pip install -r requirements.txt" fi else echo "❌ 虚拟环境创建失败,请手动创建虚拟环境" echo " 手动创建方法:" echo " 1. 安装virtualenv:pip install virtualenv" echo " 2. 创建虚拟环境:virtualenv xrequest" echo " 3. 激活虚拟环境:source xrequest/bin/activate" echo " 4. 安装依赖:pip install -r requirements.txt" fi fi else echo "❌ 虚拟环境创建失败,请手动创建虚拟环境" echo " 在Linux上,您可能需要先安装python3-venv包:" echo " sudo apt install python3.12-venv" # 针对Ubuntu/Debian系统 echo " 或者:" echo " 1. 安装virtualenv:pip install virtualenv" echo " 2. 创建虚拟环境:virtualenv xrequest" echo " 3. 激活虚拟环境:source xrequest/bin/activate" echo " 4. 安装依赖:pip install -r requirements.txt" fi fi fi # 确定激活脚本路径 # 检查是否存在 Windows 风格的激活脚本 if [ -f "xrequest/Scripts/activate" ]; then ACTIVATE_SCRIPT="xrequest/Scripts/activate" echo "📋 使用 Windows 风格的激活脚本: $ACTIVATE_SCRIPT" elif [ -f "xrequest/bin/activate" ]; then ACTIVATE_SCRIPT="xrequest/bin/activate" echo "📋 使用 Linux/Mac 风格的激活脚本: $ACTIVATE_SCRIPT" else ACTIVATE_SCRIPT="" echo "⚠️ 未找到激活脚本" fi # 安装依赖(强制使用虚拟环境里的 python -m pip;不要因为 curl 检测失败而跳过安装) echo "📦 安装依赖包..." VENV_PY="" if [ -f "xrequest/Scripts/python.exe" ]; then VENV_PY="xrequest/Scripts/python.exe" elif [ -f "xrequest/bin/python" ]; then VENV_PY="xrequest/bin/python" fi if [ -z "$VENV_PY" ]; then echo "❌ 未找到虚拟环境 Python,无法安装依赖。请先确保虚拟环境创建成功。" exit 1 fi echo "📋 使用虚拟环境 Python: $VENV_PY" echo " 📦 升级 pip/setuptools/wheel..." $VENV_PY -m pip install --upgrade pip setuptools wheel echo " 📚 使用 requirements.txt 安装所有依赖..." $VENV_PY -m pip install -r requirements.txt echo " 🔎 校验关键依赖..." $VENV_PY -c "import uvicorn, fastapi; print('OK: uvicorn/fastapi installed')" echo "✅ 依赖安装完成!" # 加载 .env 文件中的变量 echo "📄 加载环境配置..." load_env_file # 创建日志目录(使用 .env 中的 LOGS_DIR 配置) echo "📁 创建日志目录..." mkdir -p "${LOGS_DIR:-logs}" # 检查是否存在.env文件,如果不存在则创建 if [ ! -f ".env" ]; then echo "📄 创建环境配置文件..." if [ -f ".env.example" ]; then cp .env.example .env echo "✅ 已从 .env.example 创建 .env 文件,可根据需要修改配置" else # 如果没有示例文件,创建一个基本的.env文件 cat > .env << EOF # 应用配置 APP_NAME="X-Request API Framework" APP_VERSION="1.0.0" DEBUG=false # 服务器配置 HOST="0.0.0.0" PORT=1111 WORKERS=1 # 日志配置 LOG_LEVEL="INFO" LOG_FILE="logs/app.log" LOG_FORMAT="json" LOG_TO_CONSOLE=false # 高级日志配置 ADVANCED_LOGGING=true LOGS_DIR="logs" MAX_LOG_DAYS=30 ENABLE_LOG_CLEANUP=true ROUTE_BASED_LOGGING=true # 性能配置 MAX_REQUESTS=1000 MAX_CONNECTIONS=1000 REQUEST_TIMEOUT=30 # CORS配置 CORS_ORIGINS=["*"] CORS_METHODS=["*"] CORS_HEADERS=["*"] EOF echo "✅ 已创建基本的 .env 文件,可根据需要修改配置" fi fi echo "" echo "🎉 环境设置完成!" echo "" echo "🚀 启动方法:" echo " ./start.sh" echo " 或者:" echo " source xrequest/bin/activate && python main.py" echo "" echo "📚 API文档地址:" echo " http://localhost:${PORT:-3000}/docs" echo "🏥 健康检查:" echo " http://localhost:${PORT:-3000}/health" echo "" echo ""