跳到主要内容

只写清单或只写代码为什么命令不会出现?

结论​

清单里的 contributes 负责让界面知道有这个命令、菜单和配置。代码里的 registerCommand 负责激活之后真正执行。只写一边,命令要么看得见却没实现,要么实现了但界面上不存在。

展开​

只写 package.json:

  • 命令面板能搜到标题
  • 点击后宿主按命令 id 激活插件
  • 激活函数如果没 registerCommand 同一个 id,就会报找不到命令

只写代码:

  • registerCommand 在激活之后才存在
  • 没有贡献点时,命令面板不会列出它,右键也没有
  • 如果没有任何激活事件把它叫起来,这段注册根本不会执行

完整的一条命令因此要有:

  1. contributes.commands 里的 id 和标题
  2. 需要的话再写 menus、keybindings
  3. 激活事件,或依赖命令的隐式激活
  4. activate 里 registerCommand,并放进 subscriptions

配置也一样。只在代码里 getConfiguration,设置界面没有条目,用户无法发现。只在清单里声明、代码从不读取,设置没有效果。

语言功能略有差别:Provider 可以只在代码里注册,不必在清单里列「我有悬停」。但语言 id、语法、代码片段这类贡献仍然是声明式的。

面试时可以把这条说成插件的两段式:声明给工作台扫描,注册给宿主执行。工作台不会去解析你的 TypeScript 源码来发现命令。

容易讲错的点​

  • 标题写在 registerCommand 附近的注释里不会显示。标题只来自清单。
  • id 差一个大小写就等于两边都没写对。
  • 菜单贡献不会自动注册处理函数,处理函数也不会自动出现在菜单里。