模块加载
-
模块包管理器,自动更新模块
-
开始时,由 logic 中的 __init__ 触发 logic/data/__init__ 和 logic/command/__init__ 里的 ModuleManager 实例
-
初始化时加载目录路径,命名空间路径
-
加载所有模块
- 将模块加入命名空间
-
开始监听路径中的文件变化
-
存在变化
- 模块在命名空间中
- 触发重载模块
- 模块不在命名空间中
- 触发加载模块
- 模块在命名空间中
-
git pull 因为没有更新文件只是增加更改项无法触发模块加载,在 git 中进行配置可在 git pull 时自行更新模块,详见此处
- 动态更新最初采用 update 函数来更新模块
- 使用该方法,修改 yaml 文件时可修改判断条件和引入函数
- 但函数模块在导入后就不可修改了,是伪动态更新
- 之后动态更新方法采用每次引用函数前手动卸载模块然后重载
- 实现修改文件后可以动态更新效果
- 然后修改 yaml 文件的部分移动到了 config 里
- 最后优化成命名空间引用的形式,引用时只需要引用命名空间,命名空间用模块加载来自行维护其中的更新
热更新与 docker 重启冲突
- 情况 1: msg.adapter 引用 logic.data 中的某函数,由于是静态引用,模块更新后无法触发修改
- 情况 2: command.test 引用 command.base,更新 base 后,test 没有更新,导致其引用的 base 还是旧版的
- 情况 3: config.py 更新,导致容器内的 config 更新,但所有引用 config 的模块没有检测到更新,因为都是静态引用
- 在此类情况下,使用
docker compose up --build -d lrobot,由于容器外部的文件更新已经传到了容器内,容器不会重启而是继续运行 - 此时直接
docker compose restart lrobot重启容器即可,不需要重构