MRobot/code_generator_usage_check.md
2025-10-13 21:13:13 +08:00

4.6 KiB
Raw Blame History

CodeGenerator 使用情况完整检查报告

检查目标

确保 CodeGenerator 类在开发环境和打包exe环境中都能正常工作不会出现 local variable 'CodeGenerator' referenced before assignment 错误。

已修复的问题

1. 静态方法中的导入问题

已修复 - 以下静态方法已添加本地导入:

  • app/code_generate_interface.py

    • generate_code() - 第270行已添加本地导入
    • _load_csv_and_build_tree() - 第348行已添加本地导入
  • app/code_page/component_interface.py

    • component.generate_component() - 第289行已添加本地导入
  • app/code_page/bsp_interface.py

    • bsp.generate_bsp() - 第1240行已添加本地导入
  • app/code_page/device_interface.py

    • generate_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._MEIPASSPyInstaller临时目录
  • 后备使用可执行文件目录
  • 增加工作目录查找作为最后选择
  • 改进了开发环境的目录查找逻辑
  • 添加了路径规范化处理

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目录正确定位
  • 模板文件正确加载
  • 配置文件读写正常

总结

经过完整检查和修复,现在的代码应该能够在开发环境和打包环境中都正常工作。主要改进包括:

  1. 导入安全性:所有静态方法都添加了本地导入
  2. 路径处理优化了assets目录的查找逻辑
  3. 性能优化:添加了缓存机制,减少重复计算
  4. 错误处理:改进了错误提示和日志输出
  5. 兼容性:确保开发和打包环境的兼容性

建议在发布前进行完整的功能测试特别是在打包后的exe环境中测试所有代码生成功能。