nonebot2
nonebot2 copied to clipboard
重名插件支持
现在可以有两个相同名称的插件了,插件的索引标识改为使用顶层插件到该插件的插件路径。
如果有以下目录:
src/
plugins/
nested1/
plugins/
plugin.py
nested2/
plugins/
plugin.py
此时 nested1
的路径为 ("nested1",)
nested1/plugins/plugin.py
的路径为 ("nested1", "plugin")
nested2/plugins/plugin.py
的路径为 ("nested2", "plugin")
因为两个 plugin
的路径不同,因此可以两个插件都加载
修改 _plugin
字典的 key
,同时存储插件名和插件路径,它们都映射到这个插件,这应该可以保证向下兼容
现在, require
和 get_plugin
方法可以通过插件路径获取到插件了
冲突:如果存在同名插件,那么如果通过插件名来获取插件,将获取这些同名插件之中的随机一个,且无法保证获取哪一个,但旧版本插件应该不会出现同名(
🚀 Deployed on https://deploy-preview-2538--nonebot2.netlify.app
Codecov Report
All modified and coverable lines are covered by tests :white_check_mark:
Comparison is base (
3d19552
) 93.66% compared to head (c61310a
) 93.71%.
Additional details and impacted files
@@ Coverage Diff @@
## master #2538 +/- ##
==========================================
+ Coverage 93.66% 93.71% +0.05%
==========================================
Files 47 47
Lines 3696 3726 +30
==========================================
+ Hits 3462 3492 +30
Misses 234 234
Flag | Coverage Δ | |
---|---|---|
unittests | 93.71% <100.00%> (+0.05%) |
:arrow_up: |
Flags with carried forward coverage won't be shown. Click here to find out more.
:umbrella: View full report in Codecov by Sentry.
:loudspeaker: Have feedback on the report? Share it here.
你现在的改法并不正确,目前插件的父子关系是在模块被加载的时候进行判断,无法在插件管理中获取到父插件这种信息,在加载前所有插件都是平面的,如果需要在声明时得到插件的父子关系,需要改动整个 PluginManager 逻辑,来获得具有父子关系的唯一插件ID。
刚才讨论了下,可行的方案是:
-
PluginManager
需要在搜索插件前就得知道自己管理的插件是否具有父插件,不再通过运行时加载栈获取父子关系,并获得父插件的id用于构建子插件id,id格式可以为parent:child
- 在判断插件父子关系的时候要避免加载第三方插件被识别为子插件,可以根据模块路径来判断
-
PluginManager
根据第二条,就需要为自己管理的插件提供模块路径和id供后来者判断并生成其他插件id
感谢review,我能理解PluginManager
在load_plugin
之前是不知道插件的父子关系的,最开始我的设计是如果插件还没有被load就没有id,~~只是当时我发现就算把获取插件父子关系的逻辑放进~~prepare_plugins
~~里好像也没有什么问题(~~
如果我把检测的逻辑放在PluginManager.load_plugin
中是否可行?因为此时已经走了exec_module
,也就已经知道了父子关系,此时这个插件才能够通过id获取?
而至于第三方插件,我看到大部分第三方插件都是以nonebot_plugin_
作为前缀,一般也不会与本地插件冲突的
不对,我试了一下,在 PluginManager
中是能获取到插件父子关系的呀,目前看起来似乎并没有问题?
你现在的获取是通过运行时上下文获取的,和我说的搜索时加载前获取有本质差别。关于这个feature的实现,我想在下一个版本做,当前版本咱不考虑。
好吧谢谢大佬,但是我还是想知道这个会有什么问题?可以解答一下吗,感谢(