nonebot2 icon indicating copy to clipboard operation
nonebot2 copied to clipboard

重名插件支持

Open uf-fipper opened this issue 1 year ago • 8 comments

现在可以有两个相同名称的插件了,插件的索引标识改为使用顶层插件到该插件的插件路径。

如果有以下目录:

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,同时存储插件名和插件路径,它们都映射到这个插件,这应该可以保证向下兼容 现在, requireget_plugin 方法可以通过插件路径获取到插件了

冲突:如果存在同名插件,那么如果通过插件名来获取插件,将获取这些同名插件之中的随机一个,且无法保证获取哪一个,但旧版本插件应该不会出现同名(

uf-fipper avatar Jan 17 '24 16:01 uf-fipper

🚀 Deployed on https://deploy-preview-2538--nonebot2.netlify.app

github-actions[bot] avatar Jan 17 '24 16:01 github-actions[bot]

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.

codecov[bot] avatar Jan 17 '24 16:01 codecov[bot]

你现在的改法并不正确,目前插件的父子关系是在模块被加载的时候进行判断,无法在插件管理中获取到父插件这种信息,在加载前所有插件都是平面的,如果需要在声明时得到插件的父子关系,需要改动整个 PluginManager 逻辑,来获得具有父子关系的唯一插件ID。

yanyongyu avatar Jan 18 '24 02:01 yanyongyu

刚才讨论了下,可行的方案是:

  1. PluginManager 需要在搜索插件前就得知道自己管理的插件是否具有父插件,不再通过运行时加载栈获取父子关系,并获得父插件的id用于构建子插件id,id格式可以为parent:child
  2. 在判断插件父子关系的时候要避免加载第三方插件被识别为子插件,可以根据模块路径来判断
  3. PluginManager 根据第二条,就需要为自己管理的插件提供模块路径和id供后来者判断并生成其他插件id

yanyongyu avatar Jan 18 '24 03:01 yanyongyu

感谢review,我能理解PluginManagerload_plugin之前是不知道插件的父子关系的,最开始我的设计是如果插件还没有被load就没有id,~~只是当时我发现就算把获取插件父子关系的逻辑放进~~prepare_plugins~~里好像也没有什么问题(~~

如果我把检测的逻辑放在PluginManager.load_plugin中是否可行?因为此时已经走了exec_module,也就已经知道了父子关系,此时这个插件才能够通过id获取?

而至于第三方插件,我看到大部分第三方插件都是以nonebot_plugin_作为前缀,一般也不会与本地插件冲突的

uf-fipper avatar Jan 18 '24 07:01 uf-fipper

不对,我试了一下,在 PluginManager 中是能获取到插件父子关系的呀,目前看起来似乎并没有问题?

uf-fipper avatar Jan 19 '24 01:01 uf-fipper

你现在的获取是通过运行时上下文获取的,和我说的搜索时加载前获取有本质差别。关于这个feature的实现,我想在下一个版本做,当前版本咱不考虑。

yanyongyu avatar Jan 19 '24 03:01 yanyongyu

好吧谢谢大佬,但是我还是想知道这个会有什么问题?可以解答一下吗,感谢(

uf-fipper avatar Jan 19 '24 06:01 uf-fipper