Files

311 lines
8.4 KiB
RPMSpec

# -*- mode: python ; coding: utf-8 -*-
"""
PyInstaller 打包配置
"""
import os
import sys
# 获取项目根目录
def get_abs_path(path):
"""获取绝对路径"""
if os.path.isabs(path):
return path
return os.path.join(os.getcwd(), path)
a = Analysis(
['main.py'],
pathex=[os.getcwd()],
binaries=[],
datas=[
(get_abs_path('api'), 'api'),
(get_abs_path('core'), 'core'),
(get_abs_path('handlers'), 'handlers'),
(get_abs_path('mirrors'), 'mirrors'),
(get_abs_path('settings.json'), '.'),
],
hiddenimports=[
# aiohttp
'aiohttp',
'aiohttp.abc',
'aiohttp.connector',
'aiohttp.client',
'aiohttp.client_proto',
'aiohttp.client_reqrep',
'aiohttp.cookiejar',
'aiohttp.fileresponse',
'aiohttp.hdrs',
'aiohttp.http_exceptions',
'aiohttp.http_parser',
'aiohttp.http_protocol',
'aiohttp.http_server',
'aiohttp.http_websocket',
'aiohttp.multipart',
'aiohttp.payload',
'aiohttp.proxy',
'aiohttp.streams',
'aiohttp.tcp_helpers',
'aiohttp.web',
'aiohttp.web_app',
'aiohttp.web_exceptions',
'aiohttp.web_fileresponse',
'aiohttp.web_log',
'aiohttp.web_middlewares',
'aiohttp.web_protocol',
'aiohttp.web_request',
'aiohttp.web_response',
'aiohttp.web_routedef',
'aiohttp.router',
'aiohttp.web_server',
'aiohttp.web_urldispatcher',
'aiohttp.web_ws',
'aiohttp.websocket',
'aiohttp.websocket_client',
'aiohttp.websocket_handshake',
'aiohttp.websocket_protocol',
# aiohttp.multipart
'multipart',
'email.generator',
'email.policy',
'email.utils',
# sqlalchemy
'sqlalchemy',
'sqlalchemy.engine',
'sqlalchemy.engine.base',
'sqlalchemy.engine.cursor',
'sqlalchemy.engine.default',
'sqlalchemy.engine.interfaces',
'sqlalchemy.engine.row',
'sqlalchemy.engine.util',
'sqlalchemy.orm',
'sqlalchemy.orm.base',
'sqlalchemy.orm.clear_mappers',
'sqlalchemy.orm.decl_api',
'sqlalchemy.orm.declarative',
'sqlalchemy.orm.descriptor_props',
'sqlalchemy.orm.interfaces',
'sqlalchemy.orm.mapper',
'sqlalchemy.orm.properties',
'sqlalchemy.orm.query',
'sqlalchemy.orm.relationships',
'sqlalchemy.orm.session',
'sqlalchemy.orm.strategies',
'sqlalchemy.orm.strategy_options',
'sqlalchemy.pool',
'sqlalchemy.pool.base',
'sqlalchemy.pool.impl',
'sqlalchemy.dialects',
'sqlalchemy.dialects.sqlite',
'sqlalchemy.dialects.postgresql',
'sqlalchemy.dialects.mysql',
# apscheduler
'apscheduler',
'apscheduler.schedulers',
'apscheduler.schedulers.background',
'apscheduler.schedulers.base',
'apscheduler.schedulers.blocking',
'apscheduler.triggers',
'apscheduler.triggers.cron',
'apscheduler.triggers.date',
'apscheduler.triggers.interval',
'apscheduler.executors',
'apscheduler.executors.pool',
'apscheduler.job',
'apscheduler.events',
# paramiko
'paramiko',
'paramiko.transport',
'paramiko.client',
'paramiko.config',
'paramiko.hostkeys',
'paramiko.message',
'paramiko.packet',
'paramiko.primitives',
'paramiko.util',
'paramiko.ecdh',
'paramiko.ed25519key',
'paramiko.rsakey',
'paramiko.dsskey',
'paramiko.pkey',
'paramiko.agent',
'paramiko.sftp',
'paramiko.sftp_attr',
'paramiko.sftp_handle',
'paramiko.sftp_server',
'paramiko.sftp_si',
'paramiko.ssh_exception',
'paramiko.auth_handler',
'paramiko.channel',
'paramiko.shell',
'paramiko.exec',
# requests
'requests',
'requests.api',
'requests.auth',
'requests.certs',
'requests.compat',
'requests.cookies',
'requests.exceptions',
'requests.hooks',
'requests.models',
'requests.sessions',
'requests.status_codes',
'requests.structures',
'requests.utils',
# pymysql
'pymysql',
'pymysql.connections',
'pymysql.cursors',
'pymysql.converters',
'pymysql.err',
'pymysql.optionfile',
'pymysql.protocol',
'pymysql.times',
'pymysql.constants',
'pymysql.charset',
# psycopg2
'psycopg2',
'psycopg2._psycopg2',
'psycopg2.sql',
'psycopg2.extensions',
'psycopg2.extras',
# cryptography
'cryptography',
'cryptography.hazmat',
'cryptography.hazmat.backends',
'cryptography.hazmat.primitives',
'cryptography.hazmat.primitives.asymmetric',
'cryptography.hazmat.primitives.ciphers',
'cryptography.hazmat.primitives.hashes',
'cryptography.hazmat.primitives.serialization',
'cryptography.hazmat.primitives.kdf.pbkdf2',
'cryptography.x509',
'cryptography.x509.name',
'cryptography.x509.extensions',
'cryptography.fernet',
# 其他常用
'urllib3',
'urllib3.util',
'urllib3.exceptions',
'urllib3.request',
'urllib3.response',
'urllib3.poolmanager',
'charset_normalizer',
'charset_normalizer.utils',
'charset_normalizer.models',
'idna',
'idna.core',
'idna.idnadata',
'cachetools',
'croniter',
'psutil',
'psutil._psutil_linux',
'psutil._psutil_osx',
'psutil._psutil_windows',
'python_multipart',
'python_multipart.multipart',
'dataclasses',
'inspect',
'concurrent.futures',
'subprocess',
'threading',
'socket',
'ssl',
'hmac',
'hashlib',
'base64',
'struct',
'tempfile',
'shutil',
'pickle',
'json',
'os',
'sys',
'signal',
'time',
'datetime',
'math',
'logging',
'warnings',
'ctypes',
'ctypes.util',
'ctypes.wintypes',
'_ctypes',
'_socket',
'_ssl',
'select',
'errno',
'fcntl',
'grp',
'pwd',
'termios',
'tty',
'fcntl',
'resource',
'msvcrt',
'win32api',
'win32con',
'win32file',
'pywintypes',
'pythoncom',
# pyasn1 (paramiko 依赖)
'pyasn1',
'pyasn1.type',
'pyasn1.codec',
'pyasn1.codec.der',
'pyasn1.codec.der.encoder',
'pyasn1.codec.der.decoder',
'pyasn1.util',
'pyasn1.error',
# bcrypt (cryptography 依赖)
'bcrypt',
'bcrypt.__about__',
# cffi (cryptography 依赖)
'cffi',
'cffi.api',
'cffi.ffiplatform',
'cffi.backend_ctypes',
'cffi.recompiler',
'cffi.verifier',
# packaging (cryptography 依赖)
'packaging',
'packaging.version',
'packaging.specifiers',
'packaging.requirements',
# six (paramiko 依赖)
'six',
# ipaddress (paramiko 依赖)
'ipaddress',
# json (标准库)
'json.decoder',
'json.encoder',
# typing
'typing_extensions',
],
hookspath=[],
hooksconfig={},
runtime_hooks=[],
excludes=[],
win_no_prefer_redirects=False,
win_private_assemblies=False,
cipher=None,
noarchive=False,
)
pyz = PYZ(a.pure, a.zipped_data, cipher=None)
# 使用 EXE() 创建 --onefile 单文件模式
exe = EXE(
pyz,
a.scripts,
a.binaries,
a.zipfiles,
a.datas,
name='hyc-download',
debug=False,
bootloader_ignore_signals=False,
strip=False,
upx=True,
upx_exclude=[],
console=True,
)