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

Azure DevOps 中自定义控件的开发的更多相关文章

  1. 如何将Azure DevOps中的代码发布到Azure App Service中

    标题:如何将Azure DevOps中的代码发布到Azure App Service中 作者:Lamond Lu 背景 最近做了几个项目一直在用Azure DevOps和Azure App Servi ...

  2. 【OF框架】在Azure DevOps中配置项目持续集成CI服务,推送镜像到Azure容器注册表

    准备工作 开通Azure账号,具有开通服务权限,关键是里面要有钱. 开通Azure DevOps,能够创建组织和项目. 具备一定的DevOps知识,了解CICD概念.Docker基本操作. 一.创建& ...

  3. Azure DevOps 中 Dapr项目自动部署流程实践

    注:本文中主要讨论 .NET6.0项目在 k8s 中运行的 Dapr 的持续集成流程, 但实际上不是Dapr的项目部署到K8s也是相同流程,只是k8s的yaml配置文件有所不同 流程选择 基于 Dap ...

  4. 在Azure DevOps Server(TFS系统)中部署回退/回滚方案(Rollback)

    概述 Azure DevOps Server(之前名TFS)是微软公司实现软件研发.测试和部署一体化的全流程解决方案.在近几年的研发过程中,Azure DevOps Server 大幅增强了软件部署过 ...

  5. 在Azure DevOps Server 中提交Maven 依赖包(mvn deploy-file)

    Contents 1. 概述 2. 必要准备 安装Java 下载安装Maven 3. 服务器配置 新建连接源 4. 客户端配置 5. 上传maven包文件 6. 常见问题 Maven最新版本3.6.2 ...

  6. 使用ML.NET + Azure DevOps + Azure Container Instances打造机器学习生产化

    介绍 Azure DevOps,以前称为Visual Studio Team Services(VSTS),可帮助个人和组织更快地规划,协作和发布产品.其中一项值得注意的服务是Azure Pipeli ...

  7. 微软改名部又出动啦!微软宣布VSTS改名为Azure DevOps

    本篇为翻译,原文地址:https://azure.microsoft.com/en-us/blog/introducing-azure-devops/ 作者:Jamie Cool,Azure DevO ...

  8. VSTS 更名为 Azure DevOps

    微软正式对外宣布Azure DevOps,其实就是原来的VSTS,我们来看一下Azure DevOps的介绍: 今天我们宣布Azure DevOps.与世界各地的客户和开发人员合作,很明显,DevOp ...

  9. Azure DevOps Server:Git权限设置

    Azure DevOps Server 权限概述 在Azure DevOps Server (之前名称为TFS)中,权限是一个比较复杂的概念.从权限层级上来说,包括服务器级别.团队项目集合级别.团队项 ...

  10. 在WPF中自定义控件

    一, 不一定需要自定义控件在使用WPF以前,动辄使用自定义控件几乎成了惯性思维,比如需要一个带图片的按钮,但在WPF中此类任务却不需要如此大费周章,因为控件可以嵌套使用以及可以为控件外观打造一套新的样 ...

随机推荐

  1. KVM里安装不是原装的winxp系统镜像

    从网上下载的winxp系统镜像,虽然是iso格式的,但是里面的内容是如下情况的 因此安装的话,需要采取如下步骤 1.添加一个光驱引导,挂载一个iso格式的pe 2.再添加一个光驱,挂载iso格式的wi ...

  2. 等保审核 --- MySQL密码复杂度--和连接错误超时等

    系统版本: Centos 7 MySQL版本: 5.7.19 架构: 主从架构 审计插件: validate_password.so(数据库自带5.6后版本都拥有此插件) 操作过程: 1). 安装va ...

  3. 10. Fluentd部署:高可用配置

    对于高访问量的web站点或者服务,可以采用Fluentd的高可用配置模式. 消息分发语义 Fluentd设计初衷主要是用作事件日志分发系统的.这类系统支持几种不同的分发模式: 至多一次.消息被立即发送 ...

  4. 组件化开发2-安装cocoaPods

    第一步:安装ruby 不能一上来就换ruby源.虽然mac自带了ruby,但是版本一般都偏低,如果不进行更新会导致版本依赖问题. 这里使用rvm来管理ruby,它允许共存多个ruby.RVM:Ruby ...

  5. Asp-Net-Core开发笔记:集成Hangfire实现异步任务队列和定时任务

    前言 最近把Python写的数据采集平台往.Net Core上迁移,原本的采集任务使用多进程+线程池的方式来加快采集速度,使用Celery作为异步任务队列兼具定时任务功能,这套东西用着还行,但反正就折 ...

  6. python的注释、变量

    注释 注释是代码的解释型语言,不会影响代码执行,就是专门给程序员看的. 注释是很重要的代码组成部分! # 单行注释 ''' 多行注释 连续输入三个单引号 ''' """ ...

  7. 记一次 .NET 某电子病历 CPU 爆高分析

    一:背景 1.讲故事 前段时间有位朋友微信找到我,说他的程序出现了 CPU 爆高,帮忙看下程序到底出了什么情况?图就不上了,我们直接进入主题. 二:WinDbg 分析 1. CPU 真的爆高吗? 要确 ...

  8. 常用cmd及bat脚本命令

    1.内部命令和外部命令 cmd 命令 :内部命令和外部命令 内部命令 系统自带命令 dir copy 外部命令 调用应用程序,可自由拓展 mstsc.exe(mstsc)远程连接 ping (ping ...

  9. FileNotFoundError: Could not find module libmxnet.dll

    解决方法:把CUDA的bin目录下的dll文件全部复制到libmxnet.dll所在的目录 问题原因:libmxnet.dll引用了一些CUDA的dll,但是找不到路径.

  10. 谷歌拼音输入法扩展API开发指南

    为了帮助开发者在谷歌拼音输入法的基本输入功能基础上,开发和定义更丰富的扩展输入功能,谷歌拼音输入法提供了以Lua脚本编程语言为基础的输入法扩展API.利用输入法扩展API,开发者可以编写自定义的输入功 ...