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

257 lines
5.9 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.

# -*- mode: python ; coding: utf-8 -*-
import sys
from pathlib import Path
# 项目根目录
ROOT_DIR = Path.cwd()
# 需要包含的数据文件
datas = [
(str(ROOT_DIR / 'app'), 'app'), # 包含整个app目录
('.env.example', '.'), # 包含环境配置示例文件
]
# 可选数据文件(如果存在才包含)
optional_files = [
('database', 'database'), # 包含数据库相关文件
]
# 添加可选数据文件
for src, dst in optional_files:
src_path = ROOT_DIR / src
if src_path.exists():
datas.append((src, dst))
print(f"包含可选数据文件: {src}")
else:
print(f"跳过可选数据文件: {src} (不存在)")
# 隐式导入的模块
hiddenimports = [
# FastAPI相关
'fastapi',
'fastapi.templating',
'fastapi.staticfiles',
'fastapi.middleware',
'fastapi.middleware.cors',
'fastapi.responses',
'fastapi.exceptions',
# Uvicorn相关
'uvicorn',
'uvicorn.lifespan.on',
'uvicorn.lifespan.off',
'uvicorn.lifespan.on_startup',
'uvicorn.lifespan.on_shutdown',
'uvicorn.protocols.http.auto',
'uvicorn.protocols.http.h11_impl',
'uvicorn.protocols.websockets.auto',
'uvicorn.protocols.websockets.wsproto_impl',
'uvicorn.logging',
'uvicorn.main',
# Starlette相关
'starlette',
'starlette.applications',
'starlette.middleware',
'starlette.middleware.cors',
'starlette.routing',
'starlette.responses',
'starlette.staticfiles',
'starlette.exceptions',
# Pydantic相关
'pydantic',
'pydantic.main',
'pydantic.fields',
'pydantic_settings',
'pydantic.networks',
'pydantic.types',
'pydantic.validators',
'pydantic.json_schema',
# SQLAlchemy相关
'sqlalchemy',
'sqlalchemy.dialects',
'sqlalchemy.dialects.mysql',
'sqlalchemy.engine',
'sqlalchemy.ext.declarative',
'sqlalchemy.orm',
'sqlalchemy.sql',
'sqlalchemy.pool',
'sqlalchemy.event',
# 认证相关
'passlib',
'passlib.hash',
'passlib.hash.bcrypt',
'passlib.context',
'python_jose',
'python_jose.jwk',
'python_jose.jws',
'python_jose.jwt',
'python_jose.backends',
'python_jose.backends.cryptography',
'python_multipart',
'multipart',
'multipart.multipart',
# 数据库驱动
'pymysql',
'pymysql.connections',
'pymysql.cursors',
'pymysql.charset',
# Redis相关
'redis',
'redis.client',
'redis.connection',
'redis.exceptions',
'redis.commands',
'redis.asyncio',
# HTTP客户端
'httpx',
'httpx.client',
'httpx._client',
'httpx._transports',
'httpx._transports.default',
# 工具库
'loguru',
'python_dotenv',
'dotenv',
'dotenv.main',
# Alembic数据库迁移
'alembic',
'alembic.command',
'alembic.config',
'alembic.script',
'alembic.runtime',
'alembic.migration',
# 其他依赖
'email.utils',
'email.mime',
'yaml',
'toml',
'json',
'base64',
'hashlib',
'datetime',
'uuid',
'os',
'sys',
'pathlib',
'typing',
'collections',
'itertools',
'functools',
'time',
'math',
're',
'socket',
'threading',
'asyncio',
'concurrent.futures',
# MySQL相关
'cryptography',
'cryptography.hazmat',
'cryptography.hazmat.backends',
'cryptography.hazmat.backends.openssl',
'cryptography.hazmat.primitives',
'cryptography.hazmat.primitives.hashes',
'cryptography.hazmat.primitives.kdf',
'cryptography.hazmat.primitives.ciphers',
# Jinja2模板引擎FastAPI可能用到
'jinja2',
'jinja2.utils',
'jinja2.environment',
# 文件处理相关
'mimetypes',
'tempfile',
'shutil',
'gzip',
'zipfile',
# 命令行参数处理
'argparse',
'getopt',
# 编码相关
'codecs',
'encodings',
'encodings.utf_8',
'encodings.ascii',
'encodings.latin1',
'encodings.cp1252',
# 正则表达式
'regex',
# 随机数
'random',
'secrets',
# 日期时间处理
'calendar',
'time',
# 网络相关
'urllib',
'urllib.parse',
'urllib.request',
'http',
'http.server',
'socketserver',
# 异步相关
'asyncio.runners',
'asyncio.events',
'asyncio.locks',
# 多进程
'multiprocessing',
'multiprocessing.pool',
# 系统信号
'signal',
# 环境变量
'environ',
]
block_cipher = None
a = Analysis(
['main.py'],
pathex=[str(ROOT_DIR)],
binaries=[],
datas=datas,
hiddenimports=hiddenimports,
hookspath=[],
hooksconfig={},
runtime_hooks=[],
excludes=[
# 排除不需要的大型库以减小体积
'Pillow', 'PIL', 'numpy', 'scipy', 'matplotlib', 'pandas',
'torch', 'tensorflow', 'keras', 'sklearn', 'opencv',
'jupyter', 'notebook', 'ipython', 'sphinx', 'pytest',
'setuptools', 'pip', 'wheel', 'twine',
'PyQt5', 'PyQt6', 'PySide2', 'PySide6', 'tkinter',
'gtk', 'wx', 'fltk', 'kivy',
# 排除开发工具
'black', 'flake8', 'mypy', 'pylint', 'isort',
'pytest', 'unittest', 'doctest',
# 排除数据库工具
'psycopg2', 'cx_Oracle', 'sqlite3',
],
win_no_prefer_redirects=False,
win_private_assemblies=False,
cipher=block_cipher,
noarchive=False,
)
pyz = PYZ(a.pure, a.zipped_data, cipher=block_cipher)
exe = EXE(
pyz,
a.scripts,
a.binaries,
a.zipfiles,
a.datas,
[],
name='cloud-drive-server',
debug=False,
bootloader_ignore_signals=False,
strip=True, # Linux下启用strip以减小体积
upx=True, # 启用UPX压缩
upx_exclude=[],
runtime_tmpdir=None,
console=True, # 控制台应用,便于查看日志
disable_windowed_traceback=False,
argv_emulation=False,
target_arch='linux64', # 指定目标架构为64位Linux
codesign_identity=None,
entitlements_file=None,
)