首页 > 其他分享 >Azure DevOps 中自定义控件的开发

Azure DevOps 中自定义控件的开发

时间:2022-12-08 14:56:05浏览次数:72  
标签:控件 插件 自定义 service extension ._ Azure import TFS

GitHub last commit

Azure DevOps 插件: Field Unique Control

https://github.com/smallidea/azure-devops-extension-custom-control-sample


一. 概述

验证字段值的唯一性,如果相同类型的工作项使用了该值,将报错,当前工作项不能保存。

二. 快速开始

  1. 克隆git库,并进入目录
git clone https://github.com/smallidea/azure-devops-extension-custom-control-sample.git

cd azure-devops-extension-custom-control-sample
  1. 运行 npm install 安装项目所需要的npm包
  2. 运行 npm run publish,里面的tfs地址和token需要根据具体项目进行修改
  3. 在浏览器中访问你的tfs站点, http://YourTFSInstance:8080/tfs.

建议使用chrome 70版本以上

  1. 手动安装并启用插件
    • 集合设置 > 扩展 > 浏览本地插件 > 管理本地扩展 > 上传扩展 > 浏览本地文件上传插件
    • 点击进入插件详情 > 免费获取 > 选择集合,点击启用
  2. 手动更新插件
    • 集合设置 > 扩展 > 浏览本地插件 > 管理本地扩展
    • 找到需要更新的插件,点击名称后的三个点 > 选择更新 > 浏览本地文件上传插件

三. 目录结构

├── CHANGELOG.md                            更新历史
├── README.md                               
├── details.md                              详细描述
├── images                                  一些公用的图片
├── src                                     源文件
│   ├── common                              公共库
│   │   ├── apiHelper.ts                    通过azure devops的api读取相关信息
│   │   └── errorView.ts                    错误显示界面
│   ├── static                              公用的资源文件
│   │   ├── css
│   │   └── images
│   └── uniqueField                         主文件夹,单独放置的目的是方便一个工程发布多个插件
│       ├── app.ts                          主文件
│       ├── control.ts                      
│       ├── index.html                      入口
│       ├── model.ts                        
│       ├── tsconfig.json                   typescript的配置文件
│       └── view.ts
├── package.json                            包的配置文件,npm包、自定义npm run命令
├── tsconfig.json                           外层放置一个是避免调试的时候报错,因为tsconfig里面申明了vss-web-extension-sdk是一个types
└── vss-extension-uniqueField.json          插件的配置文件

在bash下面使用tree命令获取目录还不错: tree -L 3 -I 'node_module|out|dist|package-lock.json|.png|.css|license'

四. 使用vss-web-extension-sdk

使用 Microsoft VSS Web 扩展 SDK 包,vss-web-extension-sdk 英文全称 Visual Studio Services Web Extension SDK
,此 SDK 包括一个 JavaScript 库,该库提供与嵌入你的扩展插件的页面进行通信所需的 Api。

import * as VSSService from "VSS/Service";
import * as WitService from "TFS/WorkItemTracking/Services";
import * as ExtensionContracts from "TFS/WorkItemTracking/ExtensionContracts";
import * as Q from "q";

API

API 函数 用途
VSSService VSS.getConfiguration() 可以获取到相应的配置
WitService getService() 返回一个服务器实例
getFieldValue() 获取当前工作项字段的值值
setFieldValue() 设置当前工作项字段的值
getAllowedFieldValues() 获取字段的允许的值,即在配工作项模版配置时的下拉框中的选项列表

核心代码

  • 获取允许的值
WitService.WorkItemFormService.getservice().then(
    (service) => {
        service.getAllowedFieldValues(this._fieldName), (allowedValues: string[]) => {
            // do something
        }
    }
)
  • 使用Q来处理回调, 当有多个回调时,可以使用Q.spread
WitService.WorkItemFormService.getService().then(
    (service) => {
        Q.spread<any, any>(
            [service.getAllowedFieldValues(this._fieldName), service.getFieldValue(this._fieldName)],
            (allowedValues: string[], currentValue: (string | number)) => {
                //do something
            }
        )
    }
)
  • 抛出错误,阻止保存 service.setError; 清除错误 service.clearError。
WitService.WorkItemFormService.getService().then(
            (service) => {
                // 验证唯一性
                this._validUniq(this._workItemId, value).then(isValid => {
                    if (isValid == false) {
                        service.setError(`${value} 已经在当前团队项目中被使用,请使用其他!`);
                    } else {
                        service.clearError();
                        service.setFieldValue(this._fieldName, value).then(
                            () => {
                                this._update(value);
                            }, this._handleError);
                    }

                });

            },
            this._handleError
        );
  • 调用wiql
import VSS_Service = require("VSS/Service");
import TFS_Wit_Client = require("TFS/WorkItemTracking/RestClient"); 
import TFS_Wit_Services = require("TFS/WorkItemTracking/Services");
import TFS_Core_WebApi = require("TFS/Core/RestClient");

var witClient = VSS_Service.getCollectionClient(TFS_Wit_Client.WorkItemTrackingHttpClient);
const query = {
            query: `SELECT [System.Id]
                    FROM WorkItemLinks 
                    WHERE ([System.Links.LinkType] = 'System.LinkTypes.Hierarchy-Forward') 
                        AND (Target.[System.TeamProject] = @project 
                        )  mode(Recursive, ReturnMatchingChildren)`
        };
let workItemQueryResult = await witClient.queryByWiql(query, project.name, null);

五. 用于打包、发布的命令

  1. clean 删除运行过程中生成的文件
  2. precompiled:uniqueField 预编译,执行clean、tsc
  3. package:prod:uniqueField 打包成vsix文件,手动发布到tfs,通常这种比较适合生产环境
  4. publish:test:uniqueField 直接发布到tfs,通常适用于测试环境

六. 调试

TODO

标签:控件,插件,自定义,service,extension,._,Azure,import,TFS
From: https://www.cnblogs.com/smallidea/p/16966070.html

相关文章

  • 一个模仿HTML5功能的jquery控件
    原文:http://www.matiasmancini.com.ar/html5form_en.php大致将要点翻译下:在HTML5中,验证输入框等都可以不用JAVASCRIPT就能实现了,现在只有少部分浏......
  • 关于el-table在使用自定义合计时合计行无法显示问题
    问题今天在使用elementui的el-table合计功能时发现合计行无法显示解决首先,定位问题所在,经过反复刷新发现每次在获取数据之后summary-method的方法都有重新执行在页......
  • 五、获取自定义复杂对象
     JavaScript获取复杂的数据一般使用拼接字符串或使用xml,但是在asp.net中,我们可以使用GenerateScriptType(typeof(自定义类))属性来返回较复杂的对象,并在客户端使用属性来直......
  • 三、继续进行——Asp.net ajax的主要控件
     一、前言打开工具箱的Ajaxextensions可以看到五个ajax控件,在vs2008中它们已经集成到了.netframerwork3.5中,如果是之前版本的vs则需要自己去下载文件来安装。这五个控件......
  • 容器指南之自定义LNMP容器镜像
    1.简介在Linux环境中最常用的组件应该属于LNMP组合(Linux+Nginx+Mysql+PHP),当然,随着Go、Rust语言的普及,生产环境有更多的组合配置。但是Nginx的Web端和MySQL的数据......
  • 【NX二次开发】线性尺寸控件-nan(ind)
     #include<cmath>doubledouLinear_dim0=this->linear_dim0->GetProperties()->GetDouble("Value");if(isnan(douLinear_dim0)){//错误,值应为数字!} ......
  • 【Azure 环境】使用 az ad group create 时候遇见 Insufficient privileges to comple
    问题描述使用ChinaAzure,通过AzureCLI创建AAD组报错,提示权限不足 Insufficientprivilegestocompletetheoperation#使用这个登录:azlogin--service-principal......
  • 自定义的Qt轮播图控件
    该控件是模仿了一个名叫QCoolPage的开源项目里的轮播图控件,但是实现方式跟它的完全不同。QCoolPage里是用QPushButton和QLabel加上自定义styleSheet实现的;而我是用自定义控......
  • 自定义SRP(一)
    自定义SRP管线(一)创建RenderPipelineAsset创建自定义SRP管线,我们首先需要一个RenderPipelineAsset,这可以通过使用脚本继承RenderPipelineAsset这个抽象类来创建自己的Rend......
  • ES自定义评分机制:function_score查询详解
    一、function_score介绍主要用于让用户自定义查询相关性得分,实现精细化控制评分的目的。在ES的常规查询中,只有参与了匹配查询的字段才会参与记录的相关性得分score的计算。......