186 lines
4.8 KiB
Python
186 lines
4.8 KiB
Python
#!/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() |