vscode編寫插件詳細過程

vscode編寫插件詳細過程

前言

之前編寫了一個vscode插件用vscode寫博客和發布,然后有園友要求寫一篇來介紹如何開發一個vscode擴展插件,或者說介紹開發這個插件的過程。然而文章還沒有寫,園子里面已經有人發布一個文章,是園友上位者的憐憫的VSCODE 插件初探介紹了自己開發的一個插件與如何簡單的開發一個插件。雖然已經有這么一個文章,但是我覺得還是可以更仔細的來介紹如何來開發一個vscode插件,也算之前說好要寫這么一個文章的一個承諾吧,于是就有了還這么篇文章。

一、開發環境介紹與安裝

為了演示一個安裝環境,我安裝了一個干凈的win10系統來操作截圖。

1.首先我們需要安裝一個最基本的Visual Studio Code,我們可以先到官網下載一最新版本的來進行安裝,點擊上面的連接,進去下載總是懂的吧。下載完后點擊安裝,然后一直下一步安裝就可以。

2.安裝完vscode后呢,我們就需要來看如何開發我們的自己的插件了,參考官方文檔Your First Extension(Example - Hello World)。根據文檔我們得知我們需要安裝一個?node.js,同樣的點擊前面的連接,到nodejs的中文網站下載一個安裝程序,下載完點擊安裝下一步就可以。

3.在安裝完上面兩個工具后,我們還需要一個生產插件代碼的東西,也就是?Yeoman?和?VS Code Extension generator.Yeoman的介紹不在本文章中,自己點擊上面的連接去了解。我們可以打開cmd來執行下面的命令來安裝這兩個工具。npm使用介紹

npm install -g yo generator-code

在完成上面的安裝后,可以通過輸入命令

yo code

來生成我們要的基本代碼。

 在os系統上可以通過用上下鍵來選擇要創建哪種類型的項目,在win可以通過輸入1、2、3這樣的數字然后按回車來選擇。

二、生成基本代碼的講解與簡單的修改

在幾個項目類型中,我們選擇了第一個TypeScript來作為我們編寫擴展的語言,其他幾個項目類型這里不做介紹。

TypeScript語法自行理解

項目結構介紹

我們創建的一個項目結構如下:

選擇創建項目后有四個輸入和一個選擇

  1. 輸入你擴展的名稱
  2. 輸入一個標志(項目創建的文件名稱用這個)
  3. 輸入對這個擴展的描述
  4. 輸入以后要發布用到的一名稱(和以后再發布時候有一個名字是對應上的)
  5. 是問你要不要創建一個git倉庫用于版本管理

以上幾個輸入都會在package.json 這個文件里面有對應的屬性來表示。輸入完之后就創建了如上圖的一個目錄結構。這里不要臉的復制了一下別人的目錄說明,由于我這個項目沒有讓生成git倉庫,所以沒有.gitignore 這個文件。還有node_modules等其他多出來的目錄結構是創建項目后運行?npm install?這個命令生成出來的。

.
├── .gitignore                  //配置不需要加入版本管理的文件
├── .vscode                     // VS Code的整合
│   ├── launch.json
│   ├── settings.json
│   └── tasks.json
├── .vscodeignore                //配置不需要加入最終發布到拓展中的文件
├── README.md
├── src                         // 源文件
│   └── extension.ts            // 如果我們使用js來開發拓展,則該文件的后綴為.js
├── test                        // test文件夾
│   ├── extension.test.ts       // 如果我們使用js來開發拓展,則該文件的后綴為.js
│   └── index.ts                // 如果我們使用js來開發拓展,則該文件的后綴為.js
├── node_modules
│   ├── vscode                  // vscode對typescript的語言支持。
│   └── typescript              // TypeScript的編譯器
├── out                         // 編譯之后的輸出文件夾(只有TypeScript需要,JS無需)
│   ├── src
│   |   ├── extension.js
│   |   └── extension.js.map
│   └── test
│       ├── extension.test.js
│       ├── extension.test.js.map
│       ├── index.js
│       └── index.js.map
├── package.json                // 該拓展的資源配置文件
├── tsconfig.json               // 
├── typings                     // 類型定義文件夾
│   ├── node.d.ts               // 和Node.js關聯的類型定義
│   └── vscode-typings.d.ts     // 和VS Code關聯的類型定義
└── vsc-extension-quickstart.md 

運行與簡單修改

介紹完目錄結構后,我們可以來運行一下看看效果如果。我們打開一個vscode并把我們的sample目錄自己拖拉到vscode的界面上,然后選擇調試窗口,并點擊開始調試或者直接按快捷鍵 F5

項目運行起來后,會調用一個新的vscode窗口在標題欄的地方顯示一個[擴展開發主機]的標題,然后這個窗口是支持我們剛才運行的插件項目的命令。

我們可以看到擴展插件已經正常的運行了,接下來我們可以來簡單修改一下代碼以實現不同的簡單功能。在修改之前需要簡單的認識兩個文件

package.json

   {"name": "sample",              //插件擴展名稱(對應創建項目時候的輸入)"displayName": "sample","description": "blog sample",  //插件擴展的描述(對應創建項目時候的輸入)"version": "0.0.1","publisher": "caipeiyu",       //發布時候的一個名稱(對應創建項目時候的輸入)"engines": {"vscode": "^0.10.10"},"categories": ["Other"],"activationEvents": [          //這是我們要理解的地方,是觸發插件執行一些代碼的配置"onCommand:extension.sayHello" //這種是通過輸入命令來觸發執行的],"main": "./out/src/extension",  //這個是配置TypeScript編譯成js的輸出目錄"contributes": {"commands": [{             //title 和 command是一個對應關系的"command": "extension.sayHello", //這個是對應上面那個命令觸發的,在代碼里面也要用到"title": "Hello World"   //這個是我們在vscode里面輸入的命令}]},"scripts": {                     //是在發布打包,或者其他運行時候,要執行的一些腳本命令"vscode:prepublish": "node ./node_modules/vscode/bin/compile","compile": "node ./node_modules/vscode/bin/compile -watch -p ./","postinstall": "node ./node_modules/vscode/bin/install"},"devDependencies": {           //這是開發的依賴包,如果有其他的依賴包,并要打包的話,需要把dev去掉"typescript": "^1.8.5","vscode": "^0.11.0"}}

extension.ts

'use strict';
// The module 'vscode' contains the VS Code extensibility API
// Import the module and reference it with the alias vscode in your code below
import * as vscode from 'vscode';// this method is called when your extension is activated
// your extension is activated the very first time the command is executed
export function activate(context: vscode.ExtensionContext) {// Use the console to output diagnostic information (console.log) and errors (console.error)// This line of code will only be executed once when your extension is activatedconsole.log('Congratulations, your extension "sample" is now active!');// The command has been defined in the package.json file// Now provide the implementation of the command with  registerCommand// The commandId parameter must match the command field in package.jsonlet disposable = vscode.commands.registerCommand('extension.sayHello', () => {//只看這個地方'extension.sayHello'和 package.json 里面的 "onCommand:extension.sayHello" 是一個對應關系// The code you place here will be executed every time your command is executed// Display a message box to the uservscode.window.showInformationMessage('Hello World!');});context.subscriptions.push(disposable);}// this method is called when your extension is deactivatedexport function deactivate() {}

這兩個文件是很重要的,基本整個插件編寫都是圍繞著這兩個文件來修改的,例如我們現在要增加多一個命令叫做 Hello Sample 那么我們先在?package.json?里面添加兩個配置

...
"activationEvents": ["onCommand:extension.sayHello","onCommand:extension.saySample"
],
"contributes": {"commands": [{"command": "extension.sayHello","title": "Hello World"},{"command": "extension.saySample","title": "Hello Sample"}]
}, 
...      

添加完這兩個配置后,我們就需要在?extension.ts?里來注冊這個命令事件

let disposable = vscode.commands.registerCommand('extension.sayHello', () => {vscode.window.showInformationMessage('Hello World!');
});context.subscriptions.push(disposable);let saySample = vscode.commands.registerCommand('extension.saySample', () => {vscode.window.showInformationMessage('This is a new sample command!');
});
context.subscriptions.push(saySample);

修改完代碼后,再次運行效果如下圖

三、 打包與發布

我們編寫完一個插件,總不能要用的時候來運行代碼然后來使用吧,而且要分享給別人也不方便啊。有個很low的辦法,就是拷貝項目到插件目錄,但是這不靠譜吧。所以我們需要一個打包工具叫?vsce?同樣的可以用npm來安裝,打開cmd執行命令

npm install -g vsce

安裝完成后可以用命令窗口 cd 到你的項目目錄下去,然后執行命令

vsce publish

來發布到marketplace.visualstudio.com上面去。發布成功后可以在vscode里面用?ext install?來按這個插件。這種做法我個人覺得特別的麻煩,還需要去配置一個token,然后這個token還的找個地方記住,還會過期,而且在發布過程中還得祈禱網絡好。所以這里不介紹,有興趣的自己看這里。那么這里來介紹一個打包成 .vsix 的插件,而且這個插件也可以通過這個頁面上傳分享。

cd到項目目錄下,然后執行命令?vsce package?來打包一個

vsce package

Executing prepublish script 'node ./node_modules/vscode/bin/compile'...

Created: /sample/sample-0.0.1.vsix

我們可以看到執行了這個命令后,再執行一個 script 'node ./node_modules/vscode/bin/compile' 這個命令是在?package.json里面有配置

"scripts": {"vscode:prepublish": "node ./node_modules/vscode/bin/compile","compile": "node ./node_modules/vscode/bin/compile -watch -p ./","postinstall": "node ./node_modules/vscode/bin/install"
},

執行完之后再創建了一個sample-0.0.1.vsix,這個就是我們打包好的插件安裝包了,只要把這個直接拖到vscode的窗口上,就會提示你安裝成功重啟vscode,我們重啟完之后就使用相關的命令。而且在插件的目錄下也多了對應sample的目錄。

至于上傳分享就自行研究咯。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/386824.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/386824.shtml
英文地址,請注明出處:http://en.pswp.cn/news/386824.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

cannot find output in imported module librosa報錯解決

librosa一直都是用處很廣泛的python聲音信號處理模塊,但在最近的版本更新中,將原本的librosa.output給刪去了。 為了代替之前的librosa.output.write_wav函數將音頻寫入wav文件中,現可以用模塊soundfile代替。 soundfile.write(file, data, …

2018-2019-2 20175328 《Java程序設計》第十一周學習總結

十三章主要內容——Java網絡編程 一、URL類 URL類是java.net包中的一個重要的類,URL的實例封裝著一個統一資源定位符(Uniform Resource Locator),使用URL創建對象的應用程序稱作客戶端程序。 一個URL對象通常包含最基本的三部分信息:協議、地…

修改Header方法

/*** 修改header信息&#xff0c;key-value鍵值對兒加入到header中,如果存在&#xff0c;替換* param request* param key* param value*/ public static void reflectRequestParam(HttpServletRequest request, String key, String value){Class<? extends HttpServletReq…

pytorch學習筆記 1. pytorch基礎 tensor運算

pytorch與tensorflow是兩個近些年來使用最為廣泛的機器學習模塊。開個新坑記錄博主學習pytorch模塊的過程&#xff0c;不定期更新學習進程。 文章較為適合初學者&#xff0c;歡迎對代碼和理解指點討論&#xff0c;下面進入正題。 import torch import numpy as npt1 torch.te…

2019年區塊鏈的主旋律是中間層協議

2019年區塊鏈的主旋律是中間層協議 過去一年加密資產市場從其峰值下跌超過85%的市值。但對我&#xff0c;一個堅定的區塊鏈企業家&#xff0c;這實際上是一件好事&#xff0c;區塊鏈的未來看起來比以往任何時候都更有希望。2017年ICO熱潮開始的瘋狂至少產生了一個強烈的積極影響…

Java枚舉的內容可以使用map的方式

枚舉的內容可以使用map的方式 package com.chinamobile.framework.common.enums;import org.springframework.util.CollectionUtils; import org.springframework.util.StringUtils;import java.util.ArrayList; import java.util.HashMap; import java.util.List; import jav…

tensorflow gpu windows配置步驟教學

本文主要針對在windows10環境下的tensorflow配置問題&#xff0c;在linux和mac等其他環境中的配置就不過多贅述(windows總是那個問題最多的環境&#xff0c;建議使用linux &#x1f603;)。 本文中配置的環境為 python 3.8.5 tensorflow-gpu 2.4.1 1. 更新nvidia顯卡驅動至最…

numpy一維數組永遠為列向量

import numpy as np a np.array([1,3,4,5]) print(a.shape) a np.transpose(a) print(a.shape) print(a)a np.ravel(a) print(a.shape) print(a)a a.reshape((1,4)) print(a.shape)輸出如下 (4,) (4,) [1 3 4 5] (4,) [1 3 4 5] (1, 4)我們會發現&#xff0c;對于一維的數…

【BJOI 2019】奧術神杖

題意 你有一個長度為 $n$ 的模板串&#xff08;由 $0-9$ 這 $10$ 個數字和通配符 $.$ 組成&#xff09;&#xff0c;還有 $m$ 個匹配串&#xff08;只由 $0-9$ 這 $10$ 個數字組成&#xff09;&#xff0c;每個匹配串有一個魔力值 $v_i$。你要把模板串的每個 $.$ 都換成一個數字…

keras模型中的默認初始化權重

權重的初始化&#xff0c;決定了模型訓練的起點。一個良好的初始化可以加快訓練過程&#xff0c;同時避免模型收斂至局部最小值。為了在訓練過程中避免使得權重的變化總沿著同一個方向&#xff0c;我們盡量避免將所有權重都初始化為同一個值&#xff0c;如全0矩陣或全1矩陣。 …

java oracle的枚舉錯誤

public enum OracleErrorTypeEnum implements BaseEnum {ORA00001("ORA-00001","不允許有重復的數據"),ORA00017("ORA-00017","請求會話以設置跟蹤事件"),ORA00018("ORA-00018","超出最大會話數"),ORA00019(&quo…

C# 篇基礎知識10——多線程

1.線程的概念 單核CPU的計算機中&#xff0c;一個時刻只能執行一條指令&#xff0c;操作系統以“時間片輪轉”的方式實現多個程序“同時”運行。操作系統以進程&#xff08;Process&#xff09;的方式運行應用程序&#xff0c;進程不但包括應用程序的指令流&#xff0c;也包括運…

keras中mean square error均方誤差理解

機器學習中&#xff0c;針對不同的問題選用不同的損失函數非常重要&#xff0c;而均方誤差就是最基本&#xff0c;也是在解決回歸問題時最常用的損失函數。本文就keras模塊均方誤差的計算梳理了一些細節。 首先看一下均方誤差的數學定義 : 均方誤差是預測向量與真實向量差值的…

Java并發Semaphore信號量的學習

public class MyThreadTest {private final static Semaphore semaphore new Semaphore(2);// 設置2個車位public static void main(String[] args) {System.out.println("start");p(semaphore, true, 1);p(semaphore, false, 2);p(semaphore, false, 3);p(semaphor…

快速理解binary cross entropy 二元交叉熵

Binary cross entropy 二元交叉熵是二分類問題中常用的一個Loss損失函數&#xff0c;在常見的機器學習模塊中都有實現。本文就二元交叉熵這個損失函數的原理&#xff0c;簡單地進行解釋。 首先是二元交叉熵的公式 : Loss?1N∑i1Nyi?log?(p(yi))(1?yi)?log(1?p(yi))Loss …

Docker搭建自己的GitLab

Docker搭建自己的GitLab docker 介紹 **GitLab: ** GitLab 是一個用于倉庫管理系統的開源項目&#xff0c;使用Git作為代碼管理工具&#xff0c;并在此基礎上搭建起來的web服務 **Docker: ** Docker 是一個開源的應用容器引擎&#xff0c;讓開發者可以打包他們的應用以及依賴…

kolla-ansible-----常用命令

常用命令 kolla-ansible prechecks -i multinode #部署前環境檢測 kolla-genpwd #生成/etc/kolla/password.yml密碼配置文件 kolla-ansible post-deploy -i multinode #生成認證文件 kolla-ansible mariadb_recovery -i /opt/mutinode #恢復數據庫 kolla-ansible -i multi…

python numpy 分離與合并復數矩陣實部虛部的方法

在進行數字信號處理的過程中&#xff0c;我們往往有對短時傅里葉變換頻譜(spectrogram)進行分析的需求。常見的分析手段對應歐拉公式分為兩種&#xff0c;要么使用模與相位的形式&#xff0c;要么使用實部虛部。本文分享一個簡單的將復數光譜圖分解為實部與虛部以及將兩個部分重…

flowable 任務節點多實例使用

我們在使用Flowable 工作流引擎的時候&#xff0c;最常用的肯定是任務節點&#xff0c;因為在OA系統、審批系統、辦公自動化系統中核心的處理就是流程的運轉&#xff0c;在流程運轉的時候&#xff0c;可能我們有這樣的一個需求&#xff0c;在一個任務節點的時候&#xff0c;我們…