| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556 |
- # @description:
- # @author: licanglong
- # @date: 2025/10/11 10:44
- import logging
- import os
- import sys
- from app.core import CTX, ImportResolver, FileResolver, HttpResolver, EM, RegisterResolverEvent
- from app.handler.event_handler import ApplicationStartupEvent
- from app.utils.pathutils import getpath
- _log = logging.getLogger(__name__)
- ImportResolver.register("file", FileResolver())
- ImportResolver.register("http", HttpResolver())
- @EM.subscribe(RegisterResolverEvent, priority=10)
- def on_register_resolver(event: RegisterResolverEvent):
- """
- 注册解析器
- """
- remaining = []
- for imp in ImportResolver.cached_imports:
- if not imp:
- continue
- if ":" not in imp:
- remaining.append(imp)
- continue
- pfx, target = imp.split(":", 1)
- if pfx == event.protocol:
- resolver = ImportResolver.resolvers[pfx]
- resource = resolver.resolve(target.strip())
- ImportResolver.environment.merge_source(resource)
- else:
- remaining.append(imp)
- ImportResolver.cached_imports = remaining
- @EM.subscribe(ApplicationStartupEvent, priority=sys.maxsize)
- def init_config_onstartup(event: ApplicationStartupEvent):
- """加载并初始化配置"""
- # 初始配置文件
- config_path = getpath(CTX.DEFAULT_CONFIG_FILE, raise_error=False)
- if not os.path.exists(config_path):
- _log.warning(f"no config file:{CTX.DEFAULT_CONFIG_FILE}")
- return
- if getattr(sys, 'frozen', False):
- extract_config_path = os.path.join(os.path.dirname(sys.executable), CTX.DEFAULT_CONFIG_FILE)
- # 如果文件不存在,解压并复制到当前工作目录
- if not os.path.exists(extract_config_path):
- os.makedirs(os.path.dirname(extract_config_path), exist_ok=True)
- # 避免权限问题:用二进制读写方式复制
- with open(config_path, 'rb') as fsrc, open(extract_config_path, 'wb') as fdst:
- fdst.write(fsrc.read())
- config_path = extract_config_path
- CTX.ENV.merge_source(FileResolver().resolve(config_path))
|