1、原理放一边,我们先来个Hello,World

1.1 安装基础环境

需要的基础环境列表:

  • Node.js
  • npm
  • vs code
  • yo generator-code
    • yo:全称Yeoman,可以把他理解为一个代码生成器
    • yo generator-code:是vsc团队基于yo编写的vsc插件的代码生成器

安装npm后通过下面的命令,安装yo generator -core

npm install -g yo generator-code
1.2 生成你的第一个VSC插件项目

执行下面的命令:

yo code

执行命令后,是下面一番景象:

这里我们先选择New Code Snippets(代码片段)

接着是各种让你选择的东西,我们可以按下面的方式选(粗体为你需要敲的字符):

  • ? Folder name for import or none for new:直接回车
  • ? What's the name of your extension? hello-world
  • ? What's the identifier of your extension? hello-world
  • ? What's the description of your extension? it's a demo
  • ? Language id: html

完事儿之后,就会帮你创建出来一个hello-world的文件夹,里面创建好各种需要的文件,我们用VSC打开这个文件夹,大概是这样一个画风:

我们打开snippets\snippets.json文件,并将其内容改为如下:

  1 {
2 "hello world": {
3 "prefix": "hw",
4 "body": [
5 "<h1>hello world</h1>"
6 ],
7 "description": "hello world"
8 }
9 }
1.3 调试扩展

在VSCode中,直接按下F5,稍等片刻即会自动启动一个新的VSCode窗口,在这个新的窗口中,就是已经加载了我们刚才编写的hello-world这个扩展。

我们可以通过ctrl + n创建一个新的页面,并将点击右下角的plan text,在弹出窗口中选择html,将文件类型改为html,然后在新的页面中键入hw,就可以看到我们刚写的hello-world的代码片段已经生效啦。

下面是一张成功后的动图:


2. VSC 扩展初探

2.1 使用VSC扩展,我们能做哪些事儿?

以下内容来自:https://code.visualstudio.com/api/extension-capabilities/overview

  • 基础版

    • 注册命令、配置、快捷键、右键菜单等

    • 存储工作空间或者全局数据
    • 显示消息通知
    • 使用快速选择,收集用户输入
    • 打开系统文件选择器,便于用户选择文件或文件夹
    • 使用Progress API显示长时间运行的操作
  • 定制主题

    • 更改代码的颜色

    • 更改VSC UI的颜色
    • 自定义文件图标
  • 声明语言特性

    • 创造一门新的语言,告诉VSC新语言的语法等语言信息

    • 添加常用代码片段
    • 添加、替换编程语言的语法
    • 使用语法注入扩展现有语法
  • 程序化的语言功能

    • 添加显示API的示例用法的悬停

    • 检测代码的语法错误、拼写错误、不规范的代码
    • 格式化代码
    • 为语言添加智能提示
  • 扩展Workbench

    • 添加自定义上下文菜单操作到文件资源管理器

    • 在侧栏中创建一个新的交互式TreeView。
    • 定义新的活动栏视图。
    • 在状态栏中显示新信息。
    • 使用WebViewAPI 呈现自定义内容。
    • 贡献源控制提供商。
  • 调试

    • 通过提供调试适配器实现,将VS Code的调试UI连接到调试器或运行时。

    • 指定调试器扩展支持的语言。
    • 为调试器使用的调试配置属性提供丰富的IntelliSense和悬停信息。
    • 提供调试配置片段。
    • 根据动态创建的调试配置启动调试会话。
    • 跟踪调试会话的生命周期。
    • 以编程方式创建和管理断点。

是不是有点眼花缭乱?没错,VSC几乎可以扩展所有的东西!

那有没有什么不能扩展?

有!那就是出于安全考虑,禁止扩展访问VSC的DOM元素!

啥?DOM元素?没错,VSC就是基于HTML + JavaScript编写的

2.2 回头仔细看看hello-world扩展
2.2.1 package.json

package.json文件中,其实放的很多东西是我们刚才在使用命令行初始化时敲的内容,如下:

  1 {
2 "name": "hello-world", // 扩展名称(ID)
3 "displayName": "hello-world", // 扩展展示名称
4 "description": "it's a demo", // 扩展描述
5 "version": "0.0.1", // 版本号
6 "engines": {
7 "vscode": "^1.32.0" // 兼容的VSC的版本,^1.32.0表示从兼容1.32.0以上的版本
8 },
9 "categories": [ // 插件的类型
10 "Snippets" //表示该插件中会包含代码片段,
11 ],
12 "contributes": { // 一些额外的信息
13 "snippets": [ // 用于代码片段的额外信息
14 {
15 "language": "html", //该代码片段的语言是html
16 "path": "./snippets/snippets.json" // 代码片段位于该文件中
17 }
18 ]
19 }
20 }

那我的项目中,可能不仅仅有html,还会有typescriptjavascript怎么办?

其实很简单,只需要在contributes下的snippets节点中增加即可,类似如下:

  1 {
2 "name": "hello-world",
3 "displayName": "hello-world",
4 "description": "it's a demo",
5 "version": "0.0.1",
6 "engines": {
7 "vscode": "^1.32.0"
8 },
9 "categories": [
10 "Snippets"
11 ],
12 "contributes": {
13 "snippets": [
14 {
15 "language": "html",
16 "path": "./snippets/snippets-html.json"
17 },
18 {
19 "language": "typescript",
20 "path": "./snippets/snippets-ts.json"
21 },
22 {
23 "language": "javascript",
24 "path": "./snippets/snippets-js.json"
25 }
26 ]
27 }
28 }

当然了,path对应的json文件,也需要手动创建一下。

2.2.2 snippets 文件夹

snippets文件夹下面存放的是代码片段,该目录名字不是固定的,只要与package.json中配置的代码片段目录一致即可。

2.2.3 README.md 文件

用户在VSCode插件中的Detail中展示的内容,用来存放插件的描述文件。

2.2.4 CHANGELOG.md

插件的变更记录

2.2.5 .vscode 文件夹

是VS Code的一些信息,默认生成的项目中,主要用来存放Debug时的一些配置。

3. 如何发布扩展

出于公司代码安全和IT策略限制,我们公司内部的扩展绝对不允许直接发布到VS Code Extension MarketPlace,所以本节只讨论如何在公司范围内发布VS Code扩展

3.1.安装VSCE
npm install -g vsce

3.2 添加publisher

VS Code在发布时,需要在package.json中定义publisher,我们调整下上面hello-world扩展中的package.json为如下:

  1
2 {
3 "name": "hello-world",
4 "displayName": "hello-world",
5 "description": "it's a demo",
6 "version": "0.0.1",
7 "engines": {
8 "vscode": "^1.32.0"
9 },
10 "publisher": "jax",
11 "categories": [
12 "Snippets"
13 ],
14 "contributes": {
15 "snippets": [
16 {
17 "language": "html",
18 "path": "./snippets/snippets.json"
19 }
20 ]
21 }
22 }
3.3 填写Readme.md

在上面第二节中已经提到过readme.md的作用了,vsc团队要求在发布时,一定不能用默认生成的readme.md的内容,那我们就随便改改吧(建议实际操作时,按VSC建议的格式认真写)

3.4 打包成.vsix

在插件根目录执行下面的命令:

vsce package

此时它会报个警告信息,让你确认:


A 'repository' field is missing from the 'package.json' manifest file.

这个是由于我们没有在package.json中填写repository字段,可以直接忽略该警告,也可以将你放扩展的源码Git路径填写一下,例如下面这样:

{
"name": "hello-world",
"displayName": "hello-world",
"description": "it's a demo",
"version": "0.0.2",
"engines": {
"vscode": "^1.32.0"
},
"publisher": "jax",
"repository": {
"url": "https://github.com/"
},
"categories": [
"Snippets"
],
"contributes": {
"snippets": [
{
"language": "html",
"path": "./snippets/snippets.json"
}
]
}
}

重新执行上面的打包命令,他就会自动生成出一个hello-world-0.0.2.vsix文件。


3.5 安装扩展

有了这个扩展,你就可以给你的小伙伴拿去安装啦,那怎么安装呢?

首先,在VS Code中按F1,并选择Extensions:Install from VSIX...这个选项,然后在弹出框中选择刚才通过vsce打包出来的hello-world-0.0.2.vsix文件即可安装完成。

安装完成后,我们可以在扩展中找到我们的扩展:


4. 相关资料推荐

VSC 插件开发从入门到Hello World的更多相关文章

  1. jquery插件开发基础入门

    jquery插件开发基础入门 入门 编写一个jquery插件开始于给jquery.fn加入新的功能属性,此处添加的对象属性的名称就是你的插件名称 jQuery.fn,myPlugin = functi ...

  2. [Chrome插件开发]001.入门

    Chrome插件开发入门 Chrome扩展文件 Browser Actions(扩展图标) Page Actions(地址栏图标) popup弹出窗口 Background Pages后台页面 实战讲 ...

  3. discuz插件开发新手入门 超详细

    作为一个新手,目前也是刚刚玩转discuz的插件功能,好东西不敢独享,就拿出来大家一起分享入门的过程.现在网上很多关于discuz的插件教程都是很简单的教程,原因可能是这个东西是商业化的东西,本着分享 ...

  4. discuz 插件开发 新手入门

    作为一个新手,目前也是刚刚玩转discuz的插件功能,好东西不敢独享,就拿出来大家一起分享入门的过程.现在网上很多关于discuz的插件教程都是很简单的教程,原因可能是这个东西是商业化的东西,本着分享 ...

  5. VsCode插件开发之入门示例

    主要参考官网:https://code.visualstudio.com/api/get-started/your-first-extension 其实也就三步 一.安装环境 npm install ...

  6. jquery插件开发快速入门

    1.添加jQuery对象方法添加jQuery对象方法:jQuery.prototype.myMethod. 在jQuery源码中有一句:jQuery.fn = jQuery.prototype,也就是 ...

  7. Vue插件开发入门

    相对组件来说,Vue 的插件开发受到的关注要少一点.但是插件的功能是十分强大的,能够完成许多 Vue 框架本身不具备的功能. 大家一般习惯直接调用现成的插件,比如官方推荐的 vue-router.vu ...

  8. 原生JavaScript插件开发[转]

    一起学习下 插件的开发,原生的. 看了这文章 JavaScript插件开发从入门到精通系列---原生JavaScript插件开发 附上 读完小结: 看了下,比较小白的方式就是把一些代码,放到一个单独的 ...

  9. MyBatis实现与插件开发

    分析源码之前也需要源码下载并安装到本地仓库和开发工具中,方便给代码添加注释:安装过程和mybatis源码的安装过程是一样的,这里就不再重复描述了:下载地址:https://github.com/myb ...

随机推荐

  1. jQuery箭头切换图片 - 学习笔记

    jQuery箭头切换图片 布局 3d位移 变形原点 jQuery transform:translate3d(x,y,z):        x 代表横向坐标移向量的长度       y 代表纵向坐标移 ...

  2. CentOS7系列--3.1CentOS7中配置NFS服务

    CentOS7配置NFS服务 1. 配置NFS服务器端 1.1. 安装nfs-utils软件 [root@server1 ~]# yum install -y nfs-utils Loaded plu ...

  3. Mac下git的环境搭建和基本使用

    前言本文将介绍git的基本概念.环境搭建.日常使用,主要针对刚接触git,或接触不久,或好久没用忘记的同学们,当然是基于mac环境的,window系统也是大同小异!本文将从以下几个模块介绍,希望能帮助 ...

  4. logminer系列文章一(logminer的使用)

    转自 http://blog.itpub.net/26613085/viewspace-1064008/ 1.安装logminer以及生成logminer数据字典所需要的包(需使用sys用户) [or ...

  5. .net网站转到出错页是如何实现的

    <customErrors mode="On" defaultRedirect="GenericErrorPage.htm"><error s ...

  6. Redis(三)Redis基本命令操作与API

    一Redis 连接 Redis 连接命令主要是用于连接 redis 服务. 实例 以下实例演示了客户端如何通过密码验证连接到 redis 服务,并检测服务是否在运行: redis 127.0.0.1: ...

  7. 转载:python的编码处理(一)

    以下内容转载自: http://in355hz.iteye.com/blog/1860787 最近业务中需要用 Python 写一些脚本.尽管脚本的交互只是命令行 + 日志输出,但是为了让界面友好些, ...

  8. libc.so.6: cannot open shared object file: No such file or diretory

    环境 centos6.6. 由于误操作 删除了 rm -f /lib64/libc.so.6 导致其他命令不能使用 解决方法: /sbin/sln /lib64/libc-

  9. 【2017.12.05 智能驾驶/汽车电子】转载:如何成为一名无人驾驶工程师 By刘少山

    之前对无人驾驶的理解就是通过刘少山老师的书:第一本无人驾驶技术书 通读之后,对智能驾驶有了一个初步的认识,如感知.决策.控制都涉及哪些领域,有哪些可以利用的技术: 但经过一段时间的实践,发现即使是在我 ...

  10. 是否含有RTTI(运行时类型信息)是动态语言与静态语言的主要区别

    运行时类型信息代表类型信息和对内存的操作能力. 运行时类型信息是运行时系统的基础. 类型信息分为编译时类型信息和运行时类型信息两种: 静态语言的类型信息只在编译时使用和保留,在可执行文件中没有类型信息 ...