- 前言
大家好,我是若川,欢迎 follow
我的 github。我倾力持续组织了一年多每周大家一起学习200行左右的源码共读活动,感兴趣的可以点此扫码加我微信 ruochuan02
参与。另外,想学源码,极力推荐关注我写的专栏《学习源码整体架构系列》,目前是掘金关注人数(4.7k+人)第一的专栏,写有20余篇源码文章。
最近 antfu
在 Twitter
上发推开发了一个 VSCode
插件。
你应该有碰到这样的场景。自己公司项目 gitlab
或者 github
项目。想快速打开网页去做一些操作,但耗时很久。那么有了这个插件后就方便快速很多,直接在状态栏点击一下图标即可打开。
安装插件 open in github button,github repo 后,会安装上依赖的另外一个插件 Open in GitHub,github repo。
Open in GitHub
插件也提供了一些用户自定义配置。支持配置为自己的域名,比如 gitlab
,配置好后就能打开相应的项目地址。
可以全局设置 @ext:fabiospampinato.vscode-open-in-github
。如下图所示:
也可以在项目中新增 .vscode/setting.json
配置。
1 | json复制代码// setting.json |
除了包含打开项目的命令,还包含了其他很多命令,比如打开 issue、action、pull request、release 等
,可以按快捷键:ctrl + shift + p
输入 >open in github
查看。
本文主要来讲述它们的实现原理。
学完本文,你将学到:
1 | sh复制代码1. 如何开发一个 VSCode 插件 |
- 环境准备
1 | bash复制代码# 克隆我的项目 |
- vscode-open-in-github-button 项目
3.1 package.json scripts 命令解析
主要依赖依赖如下:
- eslint 配置 @antfu/eslint-config
- 使用正确的包 @antfu/ni
- 提升版本发布相关 bumpp
- 执行node ts 相关 esno
- pnpm
- vite
- vitest
- vscode 插件发布相关 vsce
- tsup ts 打包构建相关
scripts
分析
1 | json复制代码{ |
3.2 github actions
看项目前,我们先来看下 github actions
配置。
了解 GitHub Actions
一个开源项目,一般会有基础的 workflow。
- ci 每次 git push 命令时自动执行 lint 和 test 等,保证校验通过。
- release:每次检测到 git tag,就自动发一个包。
3.2.1 ci
安装 pnpm ,使用 node 16.x,全局安装 ni 工具,执行 nci npm ci npm run lint
有三个job:lint
、typecheck
、test
。
这块代码由于太长,有删减,可点此查看完整代码。
1 | yml复制代码# vscode-open-in-github-button/.github/workflows/ci.yml |
3.2.2 release 发布
git push tag 时触发,用 changelogithub 生成 changelog
。
其中自动令牌身份验证 secrets.GITHUB_TOKEN
1 | yml复制代码# vscode-open-in-github-button/.github/workflows/release.yml |
我们来简单看下测试用例。这个项目用 vitest 测试。写了一个假的测试用例,因为在这个项目中没什么好测试的。
3.2.3 vitest 测试
1 | js复制代码// test/index.test.ts |
3.3 入口文件 index.ts
1 | ts复制代码import { StatusBarAlignment, window } from 'vscode' |
点击状态栏的 open in github
按钮,其实执行的是 'openInGitHub.openProject'
命令。
3.4 openInGitHub.openProject
这时放几个官方链接。
VSCode 插件市场
vscode api
如果看英文文档吃力,这里推荐 Edge
浏览器可以翻译成中文,或者谷歌自带的翻译,或者其他翻译插件。
翻看文档和 项目package.json
文件,我们可以得知,这个命令并不是官方提供的,而是依赖第三方的扩展插件。
1 | json复制代码{ |
我们来看这个插件,vscode-open-in-github。
open in project
贡献文档
Contributing
If you found a problem, or have a feature request, please open an issue about it.
If you want to make a pull request you can debug the extension using Debug Launcher.
调试安装作者推荐的调试工具 Debug Launcher
。
我们找到 main
入口文件。
- vscode-open-in-github package.json
入口文件
1 | json复制代码{ |
主要依赖如下:
- 调试项目
克隆项目,然后安装依赖
1 | bash复制代码git clone https://github.com/fabiospampinato/vscode-open-in-github.git |
选中 package.json
中的,"main": "out/extension.js"
,按 ctrl + shift + p
。输入选择 debug launcher auto
即可调试。
- 入口 src/extension.ts
我们可以从 webpack.config.js
配置看到入口文件 src/extension.ts
,可以提前去打好断点等。
1 | ts复制代码// vscode-open-in-github/webpack.config.js |
1 | ts复制代码// vscode-open-in-github/src/extension.ts |
6.1 Utils 工具函数
1 | ts复制代码/* IMPORT */ |
6.2 Commands 导出的命令函数
1 | ts复制代码// vscode-open-in-github/src/commands.ts |
导出的函数,我们可以看出是调用的 URL.open
函数。
我们可以接着看 URL
对象。
6.3 URL 对象
1 | ts复制代码// vscode-open-in-github/src/url.ts |
之前如果我们在 URL.get
这里断点。
我们可以跟着断点调试,来看 URL.get
函数。
6.3.1 URL.get 函数
1 | ts复制代码const URL = { |
我们来重点看下 Utils.repo
对象导出的函数。
6.4 Utils.repo 对象
1 | ts复制代码/* IMPORT */ |
6.4.1 Utils.repo.getUrl 获取 Url
1 | ts复制代码const Utils = { |
总结一下大致流程:
vscode
使用vscode.commands.registerCommand ( command, () => handler () )
注册openProject
命令- ctrl + shift + p 输入 >open in github,选择触发 openInGithub.openProject 命令
- 执行 openProject 函数,实际调用 URL.open() 函数
1 | ts复制代码async open ( file = false, permalink = false, page? ) { |
- 实际调用的是
URL.get
函数- 先根据 vscode 的能力,获取到仓库的路径
- 再根据仓库的路径,获取 git 实例(simple-git)
- 根据 git 实例,获取到仓库的 url
- 最后打开仓库 url 链接。
- 总结
行文至此,最后,我们来总结下:
通过学习一个状态栏 github
图标,即可在浏览器中打开仓库的 github
地址功能。
open in github button vscode 插件的原理,是调用了 vscode-open-in-github 插件提供的 openInGithub.openProject
命令。
而 openInGithub.openProject
命令是 VSCode
插件注册的和执行 node
脚本,使用 simple-git
获取仓库 url
等。最终 VSCode
打开浏览器访问这个链接地址。
这种场景确实存在,但我们不一定会思考到用技术方案解决它。
打开 github
仓库或者 gitlab
仓库的方式有挺多。比如终端工具 gh browse
。或者在 package.json
配置仓库链接地址,再转到找到链接地址去打开。或者找到 .git/config
中的配置 git
链接打开。
我们学会了如何利用 GitHub Actions,用 tsup 构建 ts
,用 bumpp 提升版本号等,用 changelogithub 生成 changelog
等等,开发一个开源项目。
我们还学会了用 vsce 如何打包、发布一个 VSCode
插件。学会了使用调试工具 Debug Launcher 自动化调试 VSCode
插件。
VSCode 详尽的发布插件官方文档
如果看完有收获,欢迎点赞、评论、分享支持。你的支持和肯定,是我写作的动力。
- 加源码共读交流群
最后可以持续关注我@若川,欢迎 follow
我的 github。另外,想学源码,极力推荐关注我写的专栏《学习源码整体架构系列》,目前是掘金关注人数(4.7k+人)第一的专栏,写有20余篇源码文章。
我倾力持续组织了一年多每周大家一起学习200行左右的源码共读活动,感兴趣的可以点此扫码加我微信 ruochuan02
参与。
本文转载自: 掘金