Files
full-stack-doc/backend/build.py
2025-10-14 20:05:29 +08:00

186 lines
4.8 KiB
Python
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.

#!/usr/bin/env python3
"""
云盘应用打包脚本
用于将FastAPI应用打包为可执行文件
"""
import os
import sys
import shutil
from pathlib import Path
def clean_build():
"""清理之前的构建文件"""
print("清理之前的构建文件...")
# 清理PyInstaller生成的文件
dirs_to_clean = ['build', 'dist', '__pycache__']
for dir_name in dirs_to_clean:
if os.path.exists(dir_name):
shutil.rmtree(dir_name)
print(f" ✅ 已删除: {dir_name}")
# 清理.spec文件
if os.path.exists('main.spec'):
os.remove('main.spec')
print(f" ✅ 已删除: main.spec")
def check_dependencies():
"""检查依赖是否安装"""
print("📦 检查依赖...")
required_packages = ['fastapi', 'uvicorn', 'pydantic', 'sqlalchemy', 'loguru']
missing_packages = []
for package in required_packages:
try:
__import__(package)
print(f"{package}")
except ImportError:
missing_packages.append(package)
print(f"{package} (缺失)")
if missing_packages:
print(f"\n❌ 缺少以下依赖: {', '.join(missing_packages)}")
print("请运行: pip install -r requirements.txt")
return False
print("✅ 所有依赖都已安装")
return True
def build_executable():
"""构建可执行文件"""
print("🔨 开始构建可执行文件...")
# 使用自定义的spec文件进行构建
import subprocess
result = subprocess.run([
sys.executable, '-m', 'PyInstaller',
'build.spec',
'--clean',
'--noconfirm'
], capture_output=True, text=True)
if result.returncode == 0:
print("✅ 构建成功!")
print(f"📁 可执行文件位置: {os.path.abspath('dist/cloud-drive-server.exe')}")
return True
else:
print("❌ 构建失败!")
print("错误信息:")
print(result.stderr)
return False
def create_deployment_package():
"""创建部署包"""
print("📦 创建部署包...")
dist_dir = Path('dist')
deploy_dir = Path('deploy')
# 创建部署目录
if deploy_dir.exists():
shutil.rmtree(deploy_dir)
deploy_dir.mkdir()
# 复制可执行文件
exe_path = dist_dir / 'cloud-drive-server.exe'
if exe_path.exists():
shutil.copy2(exe_path, deploy_dir / 'cloud-drive-server.exe')
print(" ✅ 复制可执行文件")
# 复制配置文件
config_files = ['requirements.txt', '.env.example']
for config_file in config_files:
if os.path.exists(config_file):
shutil.copy2(config_file, deploy_dir / config_file)
print(f" ✅ 复制配置文件: {config_file}")
# 创建启动脚本
start_script = deploy_dir / 'start.bat'
with open(start_script, 'w', encoding='utf-8') as f:
f.write("""@echo off
echo 🚀 启动云盘服务器...
echo 📝 确保MySQL和Redis服务已启动
echo.
cloud-drive-server.exe
pause
""")
print(" ✅ 创建启动脚本: start.bat")
# 创建README
readme_path = deploy_dir / 'README.md'
with open(readme_path, 'w', encoding='utf-8') as f:
f.write("""# 云盘应用部署包
## 快速启动
1. **确保数据库和缓存服务运行**
- MySQL服务器已启动
- Redis服务器已启动可选
2. **配置环境变量**
- 复制 `.env.example` 为 `.env`
- 修改 `.env` 中的数据库连接信息
3. **启动应用**
- Windows: 双击 `start.bat` 或运行 `cloud-drive-server.exe`
- 访问 http://localhost:8000
## 配置说明
在 `.env` 文件中配置以下参数:
```env
# 数据库配置
DATABASE_URL=mysql+pymysql://username:password@localhost:3306/database_name
# JWT密钥
SECRET_KEY=your-secret-key-here
# 其他配置...
```
## API文档
启动后访问:
- Swagger UI: http://localhost:8000/docs
- ReDoc: http://localhost:8000/redoc
## 故障排除
1. **端口被占用**: 修改 `.env` 中的 `PORT` 配置
2. **数据库连接失败**: 检查MySQL服务状态和连接配置
3. **缺少依赖**: 确保所有依赖已正确安装
""")
print(" ✅ 创建README文档")
print(f"📁 部署包位置: {deploy_dir.absolute()}")
return True
def main():
"""主函数"""
print("🏗️ 云盘应用打包工具")
print("=" * 50)
# 1. 检查依赖
if not check_dependencies():
sys.exit(1)
# 2. 清理之前的构建
clean_build()
# 3. 构建可执行文件
if not build_executable():
sys.exit(1)
# 4. 创建部署包
if not create_deployment_package():
sys.exit(1)
print("\n🎉 打包完成!")
print("📁 部署包位于 'deploy' 目录")
print("🚀 可以将整个 deploy 文件夹复制到目标服务器运行")
if __name__ == "__main__":
main()