Azure DevOps自定义流程模板下TFS API无法返回自定义状态如何解决
根因说明
你修改的是全局Scrum流程模板的配置,已存在的旧项目创建时使用的是修改前的模板版本,默认不会自动同步模板的更新内容,所以旧项目的工作项类型定义中仍没有新增的自定义状态,只有新建项目会直接拉取最新的模板配置,因此仅新项目可正常返回自定义状态。
修复方案
方案1:手动同步模板更新到已有项目
使用TFS内置的witadmin命令行工具,将修改后的工作项类型定义导入到所有需要生效的旧项目中:- 首先导出你修改完成的流程模板对应的工作项类型定义文件:
witadmin exportwitd /collection:http://<你的TFS服务地址>/tfs/<集合名称> /p:<模板所属的测试项目名> /n:"<你修改的工作项类型,如任务/用户故事>" /f:"C:\temp\Task.xml"- 遍历所有需要更新的旧项目,执行导入操作:
witadmin importwitd /collection:http://<你的TFS服务地址>/tfs/<集合名称> /p:<要更新的旧项目名> /f:"C:\temp\Task.xml"导入完成后需要清理TFS客户端缓存,或调用API的刷新方法拉取最新配置。
方案2:调整API逻辑,强制刷新缓存
你当前使用的WorkItemStore默认优先读取本地缓存,不会主动拉取服务端最新的工作项配置,需要在读取前主动触发刷新,调整后的代码如下:WorkItemStore workItemStore = this.tfsTeamProjectCollection.GetService<WorkItemStore>(); // 新增:强制刷新WorkItemStore的所有配置,拉取服务端最新的工作项定义 workItemStore.Refresh(); int projectConunt = workItemStore.Projects.Count; List<WorkItemFieldsInfo> workItemFieldsInfo = new List<WorkItemFieldsInfo>(); string filedRefName = "System.State"; // 状态字段的引用名,可根据实际情况修改 for (int i = 0; i < projectConunt; i++) { WorkItemTypeCollection workItemTypeCollection = workItemStore.Projects[i].WorkItemTypes; // 新增:刷新当前项目的工作项类型缓存 workItemTypeCollection.Refresh(); for (int j = 0; j < workItemTypeCollection.Count; j++) { string workitemType = workItemTypeCollection[j].Name; for (int k = 0; k < workItemTypeCollection[j].FieldDefinitions.Count; k++) { Microsoft.TeamFoundation.WorkItemTracking.Client.FieldDefinition fieldDefinition = workItemTypeCollection[j].FieldDefinitions[k]; if (filedRefName == fieldDefinition.ReferenceName) { // 新增:刷新字段允许值缓存 fieldDefinition.AllowedValues.Refresh(); List<string> allowedValues = new List<string>(); foreach (var allowedValue in fieldDefinition.AllowedValues) { allowedValues.Add(allowedValue.ToString()); } WorkItemFieldsInfo workItemFieldInfo = workItemFieldsInfo.Find(st => st.Type == workitemType); if (workItemFieldInfo == null) { workItemFieldsInfo.Add(new WorkItemFieldsInfo() { Type = workitemType, AllowedValues = allowedValues }); } else { List<string> unionFields = workItemFieldInfo.AllowedValues.Union(allowedValues).ToList(); workItemFieldInfo.AllowedValues = unionFields; } break; } } } }方案3:开启继承式流程自动同步(适用于TFS 2018及以上版本)
如果你使用的是继承类型的流程模板而非XML自定义流程,可在流程模板的设置页面开启「自动更新所有关联项目」选项,后续修改模板配置后,所有使用该模板的项目会自动同步更新内容,无需手动操作。
自定义状态配置截图

内容的提问来源于stack exchange,提问作者Arsalan Younus
相关产品推荐
相关产品推荐

