只写清单或只写代码为什么命令不会出现?
结论
清单里的 contributes 负责让界面知道有这个命令、菜单和配置。代码里的 registerCommand 负责激活之后真正执行。只写一边,命令要么看得见却没实现,要么实现了但界面上不存在。
展开
只写 package.json:
- 命令面板能搜到标题
- 点击后宿主按命令 id 激活插件
- 激活函数如果没
registerCommand同一个 id,就会报找不到命令
只写代码:
registerCommand在激活之后才存在- 没有贡献点时,命令面板不会列出它,右键也没有
- 如果没有任何激活事件把它叫起来,这段注册根本不会执行
完整的一条命令因此要有:
contributes.commands里的 id 和标题- 需要的话再写
menus、keybindings - 激活事件,或依赖命令的隐式激活
activate里registerCommand,并放进subscriptions
配置也一样。只在代码里 getConfiguration,设置界面没有条目,用户无法发现。只在清单里声明、代码从不读取,设置没有效果。
语言功能略有差别:Provider 可以只在代码里注册,不必在清单里列「我有悬停」。但语言 id、语法、代码片段这类贡献仍然是声明式的。
面试时可以把这条说成插件的两段式:声明给工作台扫描,注册给宿主执行。工作台不会去解析你的 TypeScript 源码来发现命令。
容易讲错的点
- 标题写在
registerCommand附近的注释里不会显示。标题只来自清单。 - id 差一个大小写就等于两边都没写对。
- 菜单贡献不会自动注册处理函数,处理函数也不会自动出现在菜单里。