这次实践的目的主要是完成如下几个特性:

  • 能够让插件可以在 vs code 的 setting 页面中进行配置,目前可以只支持 GitLab URL 和 Token 的配置。
  • 增加一个 precheck 的命令,可以对配置的 GitLab URL 和 Token 进行校验。

新增自定义的命令映射

  在基本的开发环境搭建好后,现在至少已经可以启动调试并通过控制台命令触发一个 Hello World 的消息通知。那么在这个基础上修改一个自己的命令并不难。直接修改 package.json 下的 contributes.commands 部分增加一个自己定义的命令 gldevops.precheck

{
    /*.......*/
    "contributes": {
		"commands": [
			{
				"command": "gldevops.precheck",
				"title": "GitLab DevOps Management: Begin to do precheck."
			}
        ]
        /*.......*/
    }
    /*.......*/
}

  同时修改的还有 activationEvents 列表。

{
    /*.......*/
    "activationEvents": [
        "onCommand:gldevops.precheck"
        /*.......*/
    ]
    /*.......*/
}

  配置修改完成后,对应到代码层面上的更改主要是使用 vscode.commands.registerCommand 方法注册指定的函数为 gldevops.precheck。这样才能建立上映射。

let disposable = vscode.commands.registerCommand('gldevops.precheck', () => {/*Your code here*/});
context.subscriptions.push(disposable);

从 vs code 的 setting 页面中读取自己的配置

  首先,还是从 package.json 入手,通过配置可以让 vs code 自动识别并生成相关的配置选项到 setting 页面之中。

{
    /*.......*/
    "configuration": {
        "title": "GitLab DevOps Management",
        "properties": {
            "gitlabDevopsMgt.instanceUrl": {
                "type": "string",
                "default": "https://gitlab.com",
                "description": "Your GitLab instance URL (default is https://gitlab.com)"
            },
            "gitlabDevopsMgt.personalAccessToken": {
                "type": "string",
                "default": null,
                "description": "Your GitLab Personal Access Token"
            }
        }
    }
    /*.......*/
}

  在代码中获取相关的配置,并使用。

let gitlabUrl = vscode.workspace.getConfiguration('gitlabDevopsMgt').instanceUrl.match('http[s]*://[^/]+');
let gitlabToken = vscode.workspace.getConfiguration('gitlabDevopsMgt').personalAccessToken;

校验填写的 GitLab URL 和 Token

  获取到指定的 URL 和 Token 后,需要对它们进行校验。校验方法这里使用获取 GitLab 服务器版本信息的办法,通过 /api/v4/version 来获取到版本信息进行验证。

  这里需要用到一个 HTTP 请求连接的库,这里用 needle 来作为 backend。在 package.json 中需要增加对 needle 库的引用。

"devDependencies": {
    /*.......*/
    "@types/needle": "^2.4.0",
    /*.......*/
    "needle": "^2.4.0"
    /*.......*/
}

  在代码层面,实现一个模块封装 HTTP 相关操作。

import * as needle from 'needle';

// The module 'requests' implementation a HTTP request operator class
export namespace HttpClient {
    export class Requests {

        constructor() {
            console.log("Requests initialize...");
        }

        // do some implementation
        public get(url: string, options: any = undefined) {
            console.log("Begin to do GET request for " + url + " ...");
            var resp = needle('get', url, options);
            return resp;
        }

        public post() {
            console.log("Begin to do POST request...");
        }

        public put() {
            console.log("Begin to do PUT request...");
        }

        public delete() {
            console.log("Begin to do DELETE request...");
        }
    }
}

  对于自己开发的模块,可以增加一个单元测试,这样可以有效的提高模块的稳定性。

import * as vscode from 'vscode';

import * as assert from 'assert';

import * as requests from '../../requests';

suite('Requests Class Test Suite', () => {
    vscode.window.showInformationMessage('Start Requests test...');

    test('GET request test', () => {
        // do get request test
        var options = {
            open_timeout: 20000,
            headers: {
                'Content-Type': 'application/json',
                'PRIVATE-TOKEN': 'AXUiDDXJrK19HfqypV7x'
            }
        };
        var req = new requests.HttpClient.Requests;
        var res = req.get('https://gitlab.com/api/v4/version', options);
        assert.notEqual(res, undefined);
        res.then((resp) => {
            assert.equal(resp.statusCode, 200);
            assert.notEqual(resp.body, null);
            assert.notEqual(resp.body, undefined);
            assert.notEqual(resp.body.version, undefined);
            assert.notEqual(resp.body.revision, undefined);
            console.log("Status code: " + resp.statusCode);
            console.log("GitLab version: " + resp.body.version);
            console.log("GitLab revision: " + resp.body.revision);
        });
        res.catch((err) => {
            assert.equal(err, undefined);
            console.log("Get Error: " + err);
        });
    });

    test('POST request test', () => {
        // do post request test
        var req = new requests.HttpClient.Requests;
        req.post();
    });

    test('PUT request test', () => {
        // do put request test
        var req = new requests.HttpClient.Requests;
        req.put();
    });

    test('DELETE request test', () => {
        // do delete request test
        var req = new requests.HttpClient.Requests;
        req.delete();
    });
});

总结

  这一阶段的代码可以看这里。这个阶段,已经完成了 vs code extension 本身的搭建和对接 GitLab API 的初步实现。那么下一阶段,需要完成的任务有:

  • 在 vs code 的左侧边栏上增加一个属于这个插件自己的 Logo,当用户点击这个 Logo 的时候进行 GitLab 的初始化校验并弹出一个工作面板。
  • 对这个 Token 所能够显示的 Group 和 Project 用 Tree List 空间进行展示(最好和 vs code 风格统一),并标明权限。