Files

300 lines
10 KiB
Bash
Raw Permalink Normal View History

#!/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. 安装virtualenvpip install virtualenv"
echo " 2. 创建虚拟环境virtualenv xrequest"
echo " 3. 激活虚拟环境xrequest/Scripts/activate"
echo " 4. 安装依赖pip install -r requirements.txt"
fi
else
echo "❌ 虚拟环境创建失败,请手动创建虚拟环境"
echo " 手动创建方法:"
echo " 1. 安装virtualenvpip 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. 安装virtualenvpip 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. 安装virtualenvpip 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. 安装virtualenvpip 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. 安装virtualenvpip 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 ""