mirror of
https://github.com/goldenfishs/MRobot.git
synced 2025-11-02 12:33:10 +08:00
136 lines
4.6 KiB
Markdown
136 lines
4.6 KiB
Markdown
# 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._MEIPASS`(PyInstaller临时目录)
|
||
- 后备使用可执行文件目录
|
||
- 增加工作目录查找作为最后选择
|
||
- 改进了开发环境的目录查找逻辑
|
||
- 添加了路径规范化处理
|
||
|
||
### 2. 错误处理改进
|
||
✅ **已改进**:
|
||
- 更好的错误提示信息
|
||
- 只在第一次访问路径时显示警告
|
||
- 防止重复日志输出
|
||
|
||
## 建议的进一步改进
|
||
|
||
### 1. 添加环境检测工具方法
|
||
```python
|
||
@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. 配置验证方法
|
||
```python
|
||
@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环境中测试所有代码生成功能。 |