这个会在更底层的 cordis 中解决,未来会有例如 ctx.fs
等无副作用的 api。
代码层面的方案就是:指令使用插件名称,而不是其他过于常见的单词。当两个插件功能一样或高度重合,则不需要担心重复问题,因为在功能上本身就是重复的,这也是预期的。
PR‘s Welcom
这个会在更底层的 cordis 中解决,未来会有例如 ctx.fs
等无副作用的 api。
代码层面的方案就是:指令使用插件名称,而不是其他过于常见的单词。当两个插件功能一样或高度重合,则不需要担心重复问题,因为在功能上本身就是重复的,这也是预期的。
PR‘s Welcom
哦哦 原来现在原名也可以禁用了!
我赞同将唯一指令名这段写入文档,其次如上面所述,中文指令名在接下来的版本将得到一个警告。
我想到一种可行的方法来解决你所说的"让开发者写出尽可能唯一的指令名":
上述更改需要以下前置更改:
但是目前来看,在没有执行这个方案之前,最好的做法还是将插件名称硬编码进插件内部。同时,原有硬编码的插件也不会因为migration这个行为而受到损失(blockly.help - blockly.blockly.help)
你说得对,可以限制开发者行为。但这一点我和梦梦卞过,结论是系统外副作用很难而且不应该被回收。
为什么?
首先,你如果尝试回收系统外副作用,那么一定会出现副作用的副作用。也就是它一定要一个地方记录产生的副作用。这样存在两个问题:1. 如果当前记录被外部应用程序更改,那么很可能记录的副作用就会产生错误。2. 那么我们如何回收副作用的副作用(也就是记录副作用的文件) 3. 如何界定副作用回收时机,比如文件读写,你如何界定文件读写已经完成,这个文件是否应该要删除…等等。所以我认为"ctx.fs"并不能保证无副作用/可回收的副作用,它保证的只是"系统内"可回收的副作用,也就是只能保证行为(占用文件等)副作用能在插件卸载之后被回收,而不能保证结果(写入了文件,影响了文件系统结构)的副作用能被回收。
so, cordis os when
肯定不行的啊 原名是唯一标识
I think he was referring the feature that we could disable the original name for triggering the command and use several aliases instead.
同意见。插件 ID 的唯一性有外部保证,这样的设计应该能完全消除开发者对指令重名的担忧,减轻负担。
但是在用户侧,因为用户仍旧用不带插件 ID 的指令名调用,故也仍应该对指令名重名有相应警告或错误,提醒用户编辑别名。
Koishi 目前的设计假定插件开发者应当且会负有给指令起好名字的责任,但社区内的插件作者开发经验差异很大。以我的使用经历而言,有相当多的活跃、优质的插件,其作者也并未意识到这份责任,中文名和简短指令原名俯仰皆是。另一方面,一些代码简单的插件基本处于归档状态,无法指望及时的更新。当它们重名时,要求插件作者来处理重名问题一定会非常低效,甚至无法推进。当然社区可以重复开发功能相同的插件来解决,但这也算不上是一个非常优雅的结局吧。
@Lipraty 和 @shigma 关于 为何指令原名应当唯一 的论述都非常正确,但是 Koishi 或许自身可以做到系统内保障任意插件的原名路径唯一,而不下放这项任务到每一个开发经验差距很大的插件作者身上。
用 插件 ID + 指令名
代表某个插件指令的这个想法很直观,所以我不太确定没有采用这种做法是否有其他原因。不过既然有人提及了,我也就跟帖表达一下我的想法了(
谔谔,怎么吵起来了。请大家友善讨论。
最热闹的一集
我也觉得没有吵起来呀(
文化人的事能叫吵吗(
就我一个土狗
写了快 1000 字又给我删了。
大家的观点都挺好的。
这里是指,唯一标识可以不作为alias了
我有两个不同的插件,插件的每个指令我都加上了插件名前缀作为命名空间,已经保证了原名的唯一性。
但是我这两个插件分别在两个不同的平台使用,功能完全不一样,为了易用性,我需要给其中的某条指令设置别名 ”重置“。而重置这个功能在这两个插件中都有。
虽然我通过插件的过滤器设置好了这个插件只能在这个平台上用,但是别名似乎无法设置过滤器,它是全局的。
如果我禁用了其中一个别名,在那个平台上的那个指令就会无法触发。
现在我只能通过开两个 Koishi 实例来实现这一点。
对于这样的需求有什么更好的解决方法吗?
顺便一提,其中的 help
指令我也设置了 ”帮助“ 作为别名
但是仍会触发 Koishi 原有的 help
指令,原 help
指令又找不到在哪禁用 帮助
这个别名,我只能把 help 插件给禁用了。
直截了当的解决方法:
可以喜人的解决方法:
在这个例子中,「别名的过滤器」中的别名实际上和现有的别名不是一个概念了
就像我在另一帖中写的那样,可以做个插件来实现上述的事情。(等我晚上摸一个)
update:
commands怎么不给slot啊,纯schema也太难受了
呜呜呜果然我还是写不来社区插件,跑路了,姑且摸了一个,仅供参考
直截了当的解决方法:
- 给 Koishi 提 issue,建议支持别名的过滤器(我觉得可以做)
Feature: 支持别名的过滤器 · Issue #1369 · koishijs/koishi (github.com)
可以喜人的解决方法:
- 写一个重置服务,专门提供重置指令,然后两个插件分别调用这个服务定义重置时的行为
- 由于重置指令只有一个,所以永远不会冲突
- 如果有第三个插件冲突了,你让他也用你写的服务
重置只是其中一个功能,还有其他类似“设置”、“帮助” 等常见的功能,如果做成服务或者插件的话应设计得通用。
也不知道可不可以通过服务或插件解决