mirror of
https://github.com/goldenfishs/MRobot.git
synced 2025-11-02 04:23:10 +08:00
4.6 KiB
4.6 KiB
CodeGenerator 使用情况完整检查报告
检查目标
确保 CodeGenerator 类在开发环境和打包exe环境中都能正常工作,不会出现 local variable 'CodeGenerator' referenced before assignment 错误。
已修复的问题
1. 静态方法中的导入问题
✅ 已修复 - 以下静态方法已添加本地导入:
-
app/code_generate_interface.pygenerate_code()- 第270行已添加本地导入_load_csv_and_build_tree()- 第348行已添加本地导入
-
app/code_page/component_interface.pycomponent.generate_component()- 第289行已添加本地导入
-
app/code_page/bsp_interface.pybsp.generate_bsp()- 第1240行已添加本地导入
-
app/code_page/device_interface.pygenerate_device_header()- 第44行已添加本地导入get_device_page()- 第321行已添加本地导入
2. 相对导入问题
✅ 已修复 - 统一使用绝对导入:
app/code_page/component_interface.py第321行的相对导入已改为绝对导入
3. 缓存和性能优化
✅ 已优化:
- 添加了
_assets_dir_cache和_assets_dir_initialized缓存机制 - 优化了
get_template_dir()方法,减少重复日志输出 - 改进了路径计算,避免重复的文件系统操作
安全的使用场景
1. 实例方法中的使用(✅ 安全)
这些使用 CodeGenerator 的地方都是在类的实例方法中,可以正常使用顶层导入:
ComponentSimple.__init__()- 第108行ComponentSimple._generate_component_code_internal()- 第172行ComponentSimple._get_component_template_dir()- 第182行ComponentSimple._save_config()- 第186, 191行ComponentSimple._load_config()- 第195行DevicePageBase.__init__()及相关方法BspPeripheralBase各种实例方法DataInterface.show_user_code_files()- 已有本地导入DataInterface.generate_code()- 已有本地导入DataInterface.generate_task_code()- 已有本地导入
2. 模块级别函数(需要验证)
以下独立函数需要确认是否使用了 CodeGenerator:
load_device_config()get_available_bsp_devices()load_descriptions()(bsp)get_available_*()系列函数
打包环境优化
1. 路径处理优化
✅ 已优化 get_assets_dir() 方法:
- 优先使用
sys._MEIPASS(PyInstaller临时目录) - 后备使用可执行文件目录
- 增加工作目录查找作为最后选择
- 改进了开发环境的目录查找逻辑
- 添加了路径规范化处理
2. 错误处理改进
✅ 已改进:
- 更好的错误提示信息
- 只在第一次访问路径时显示警告
- 防止重复日志输出
建议的进一步改进
1. 添加环境检测工具方法
@staticmethod
def is_frozen():
"""检测是否在打包环境中运行"""
return getattr(sys, 'frozen', False)
@staticmethod
def get_base_path():
"""获取基础路径,自动适配开发/打包环境"""
if CodeGenerator.is_frozen():
return getattr(sys, '_MEIPASS', os.path.dirname(sys.executable))
else:
return os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
2. 配置验证方法
@staticmethod
def validate_assets():
"""验证assets目录是否存在并包含必要文件"""
assets_dir = CodeGenerator.get_assets_dir()
required_dirs = ["User_code/bsp", "User_code/component", "User_code/device"]
for req_dir in required_dirs:
path = os.path.join(assets_dir, req_dir)
if not os.path.exists(path):
return False, f"缺少必要目录: {path}"
return True, "Assets目录验证通过"
测试清单
开发环境测试
- 启动应用程序无错误
- 生成BSP代码功能正常
- 生成Component代码功能正常
- 生成Device代码功能正常
- 路径解析正确
- 无重复日志输出
打包环境测试
- 使用PyInstaller打包成exe
- exe启动无错误
- 所有代码生成功能正常
- assets目录正确定位
- 模板文件正确加载
- 配置文件读写正常
总结
经过完整检查和修复,现在的代码应该能够在开发环境和打包环境中都正常工作。主要改进包括:
- 导入安全性:所有静态方法都添加了本地导入
- 路径处理:优化了assets目录的查找逻辑
- 性能优化:添加了缓存机制,减少重复计算
- 错误处理:改进了错误提示和日志输出
- 兼容性:确保开发和打包环境的兼容性
建议在发布前进行完整的功能测试,特别是在打包后的exe环境中测试所有代码生成功能。