美文网首页
开发效率:VSCode extension/插件 开发

开发效率:VSCode extension/插件 开发

作者: SoaringHeart | 来源:发表于2021-11-28 10:58 被阅读0次

一. VSCode extension 可以做什么?

如果你有一个很棒的(关于代码的)点子,除非遇到不可实现的客观条件,否则一切皆可实现;

二. VSCode 插件开发流程

1. 开发环境配置

// 安装需要的包
npm install -g yo generator-code

2. 开发

// 运行命令,创建工程
yo code

//。。。实现功能(推荐使用typescript);

3. 插件发布

1.注册账号 https://aka.ms/SignupAzureDevOps

2.创建 Personal Access Token
点击创建新的个人访问令牌,这里特别要注意Organization要选择all accessible organizations,Scopes要选择Full access,否则后面发布会失败。

3.打包发布
vsce package

vsce publish -p <Personal Access Token>

三. extension

{
    // 插件的名字,应全部小写,不能有空格
    "name": "vscode-plugin-demo",
    // 插件的友好显示名称,用于显示在应用市场,支持中文
    "displayName": "VSCode插件demo",
    // 描述
    "description": "VSCode插件demo集锦",
    // 关键字,用于应用市场搜索
    "keywords": ["vscode", "plugin", "demo"],
    // 版本号
    "version": "1.0.0",
    // 发布者,如果要发布到应用市场的话,这个名字必须与发布者一致
    "publisher": "sxei",
    // 表示插件最低支持的vscode版本
    "engines": {
        "vscode": "^1.27.0"
    },
    // 插件应用市场分类,可选值: [Programming Languages, Snippets, Linters, Themes, Debuggers, Formatters, Keymaps, SCM Providers, Other, Extension Packs, Language Packs]
    "categories": [
        "Other"
    ],
    // 插件图标,至少128x128像素
    "icon": "images/icon.png",
    // 扩展的激活事件数组,可以被哪些事件激活扩展,后文有详细介绍
    "activationEvents": [
        "onCommand:extension.sayHello"
    ],
    // 插件的主入口
    "main": "./src/extension",
    // 贡献点,整个插件最重要最多的配置项
    "contributes": {
        // 插件配置项
        "configuration": {
            "type": "object",
            // 配置项标题,会显示在vscode的设置页
            "title": "vscode-plugin-demo",
            "properties": {
                // 这里我随便写了2个设置,配置你的昵称
                "vscodePluginDemo.yourName": {
                    "type": "string",
                    "default": "guest",
                    "description": "你的名字"
                },
                // 是否在启动时显示提示
                "vscodePluginDemo.showTip": {
                    "type": "boolean",
                    "default": true,
                    "description": "是否在每次启动时显示欢迎提示!"
                }
            }
        },
        // 命令
        "commands": [
            {
                "command": "extension.sayHello",
                "title": "Hello World"
            }
        ],
        // 快捷键绑定
        "keybindings": [
            {
                "command": "extension.sayHello",
                "key": "ctrl+f10",
                "mac": "cmd+f10",
                "when": "editorTextFocus"
            }
        ],
        // 菜单
        "menus": {
            // 编辑器右键菜单
            "editor/context": [
                {
                    // 表示只有编辑器具有焦点时才会在菜单中出现
                    "when": "editorFocus",
                    "command": "extension.sayHello",
                    // navigation是一个永远置顶的分组,后面的@6是人工进行组内排序
                    "group": "navigation@6"
                },
                {
                    "when": "editorFocus",
                    "command": "extension.demo.getCurrentFilePath",
                    "group": "navigation@5"
                },
                {
                    // 只有编辑器具有焦点,并且打开的是JS文件才会出现
                    "when": "editorFocus && resourceLangId == javascript",
                    "command": "extension.demo.testMenuShow",
                    "group": "z_commands"
                },
                {
                    "command": "extension.demo.openWebview",
                    "group": "navigation"
                }
            ],
            // 编辑器右上角图标,不配置图片就显示文字
            "editor/title": [
                {
                    "when": "editorFocus && resourceLangId == javascript",
                    "command": "extension.demo.testMenuShow",
                    "group": "navigation"
                }
            ],
            // 编辑器标题右键菜单
            "editor/title/context": [
                {
                    "when": "resourceLangId == javascript",
                    "command": "extension.demo.testMenuShow",
                    "group": "navigation"
                }
            ],
            // 资源管理器右键菜单
            "explorer/context": [
                {
                    "command": "extension.demo.getCurrentFilePath",
                    "group": "navigation"
                },
                {
                    "command": "extension.demo.openWebview",
                    "group": "navigation"
                }
            ]
        },
        // 代码片段
        "snippets": [
            {
                "language": "javascript",
                "path": "./snippets/javascript.json"
            },
            {
                "language": "html",
                "path": "./snippets/html.json"
            }
        ],
        // 自定义新的activitybar图标,也就是左侧侧边栏大的图标
        "viewsContainers": {
            "activitybar": [
                {
                    "id": "beautifulGirl",
                    "title": "美女",
                    "icon": "images/beautifulGirl.svg"
                }
            ]
        },
        // 自定义侧边栏内view的实现
        "views": {
            // 和 viewsContainers 的id对应
            "beautifulGirl": [
                {
                    "id": "beautifulGirl1",
                    "name": "国内美女"
                },
                {
                    "id": "beautifulGirl2",
                    "name": "国外美女"
                },
                {
                    "id": "beautifulGirl3",
                    "name": "人妖"
                }
            ]
        },
        // 图标主题
        "iconThemes": [
            {
                "id": "testIconTheme",
                "label": "测试图标主题",
                "path": "./theme/icon-theme.json"
            }
        ]
    },
    // 同 npm scripts
    "scripts": {
        "postinstall": "node ./node_modules/vscode/bin/install",
        "test": "node ./node_modules/vscode/bin/test"
    },
    // 开发依赖
    "devDependencies": {
        "typescript": "^2.6.1",
        "vscode": "^1.1.6",
        "eslint": "^4.11.0",
        "@types/node": "^7.0.43",
        "@types/mocha": "^2.2.42"
    },
    // 后面这几个应该不用介绍了
    "license": "SEE LICENSE IN LICENSE.txt",
    "bugs": {
        "url": "https://github.com/sxei/vscode-plugin-demo/issues"
    },
    "repository": {
        "type": "git",
        "url": "https://github.com/sxei/vscode-plugin-demo"
    },
    // 主页
    "homepage": "https://github.com/sxei/vscode-plugin-demo/blob/master/README.md"
}

setttings example:

"contributes": {
    "commands": [
        {
            "command": "extension.EasyFlutterPlugin",
            "title": "Easy Flutter Plugin"
        }
    ],
    "menus": {
        "editor/context": [
            {
                "when": "resourceLangId == dart",
                "command": "extension.EasyFlutterPlugin",
                "group": "navigation"
            }
        ]
    },
    "configuration": {
        "type": "object",
        "title": "Easy Flutter Plugin",
        "properties": {
            "easy-flutter-plugin.yourName": {
                "type": "string",
                "default": "guest",
                "description": "你的名字"
            },
            "easy-flutter-plugin.showTip": {
                "type": "boolean",
                "default": true,
                "description": "是否在每次启动时显示欢迎提示!"
            },
            "easy-flutter-plugin.input": {
                "type": "string",
                "default": "defaultValue",
                "description": "provide a input for accepting value"
            },
            "easy-flutter-plugin.inputNum": {
                "type": "number",
                "default": "1.001",
                "description": "provide a input for accepting number"
            },
            "easy-flutter-plugin.inputInt": {
                "type": "integer",
                "default": "1",
                "markdownDescription": "MarkdownDescription: provide a input for accepting integer, See the [VSCode Docs (https://code.visualstudio.com/api/references/contribution-points#contributes.configuration) for more details.\n - a: item1\n - b: itemb"
            },
            "easy-flutter-plugin.checkbox": {
                "type": "boolean",
                "default": "0",
                "description": "provide a checkbox"
            },
            "easy-flutter-plugin.dropdown": {
                "type": "string",
                "default": "defaultValue",
                "enum": [
                    "optionA",
                    "optionB",
                    "optionC"
                ],
                "description": "provide a dropdown and options",
                "enumDescriptions": [
                    "description for option A",
                    "description for option B",
                    "description for option C"
                ]
            },
            "easy-flutter-plugin.array": {
                "type": "array",
                "default": [
                    "defaultValue"
                ],
                "description": "array settings is only available at settings.json"
            },
            "easy-flutter-plugin.object": {
                "type": "object",
                "default": { 
                    "key" : "defaultValue"
                },
                "description": "object settings is only available at settings.json"
            },
            "easy-flutter-plugin.null.a": {
                "type": null,
                "default": null,
                "description": "null settings for showing group feature"
            },
            "easy-flutter-plugin.null.b": {
                "type": null,
                "default": null,
                "description": "null settings for showing group feature"
            }
        }
    }
}

其他

个人开发插件 easy-flutter-plugin 用于将 flutter plugin 功能简化;

根据 lib dart方法一键生成 objc/swift + java/kotlin + web .dart + example/lib/.main.dart + test.dart 的方法生成;

开发者只需要关注函数内部实现即可;模板化的工作让插件生成,提高开发效率;

相关文章

网友评论

      本文标题:开发效率:VSCode extension/插件 开发

      本文链接:https://www.haomeiwen.com/subject/povcxrtx.html