先纠正这条选题本身的假设:「声明过窄会被版本门拒绝」在本站实测不成立。所以这一页不是演示「被拒绝」,而是记录「什么都没发生」——后者更危险。
实测三个阶段
| 阶段 | 预期(社区说法) | 实测 |
|---|---|---|
| pnpm安装 | 被拒绝 | 成功,只有peer deps警告 |
| dump-config合成 | 插件留在列表但不加载 | 正常合成 - id: dsh-context 条目,无任何拒绝记录 |
| 启动web | 不运行 | 静默挂起:70秒零输出、进程不退、无报错 |
那到底该写多宽
- engines.dsh写什么都不会被拦,所以它的实际作用是「告诉人」而不是「约束机器」。写窄了至少能让维护者看懂你的意图。
- 真正决定能不能跑的是client.inject。如果你的插件注入客户端包,宿主缺包就直接挂,engines写多宽都救不了。
- 服务端插件(无client子树)安全得多——本站对照的billion-context只声明node,正常启动。
作为插件作者可以做的一件事
在你的README里明确写出「需要宿主提供哪些inject目标」,比在engines.dsh里写一串版本区间有用得多。因为版本区间不会被校验,而缺包会让人卡死且找不到原因。
作为使用者:装之前算inject差集。本站 /plugins/ 那张核验表就是干这个的——13个插件里4个会静默挂起,都是inject缺包。