Azure Boards扩展开发:规则引擎评估报错排查求助
Azure Boards扩展规则引擎错误:Node not found:extension_dev\Sprint 1
错误信息
ms.vss-work-web.work…es6.CHv17_.min.js:1 Error: Error occured in Rule Engine Evaluate. Name: undefined Message: Node not found:extension_dev\Sprint 1 Rules.length: 2 Rules.Information: Block,Computed,-104,Trigger,-104 Stack: Error: Node not found:extension_dev\Sprint 1 at i.validate (ms.vss-work-web.work…v17_.min.js:1:46504) at i.evaluate (ms.vss-work-web.work…v17_.min.js:1:37157) at t.<computed>.RuleEngine._evaluateFieldRule (ms.vss-work-web.work…v17_.min.js:1:49623) at ms.vss-work-web.work…v17_.min.js:1:49907 at Array.forEach (<anonymous>) at t.<computed>.RuleEngine._evaluateFieldRule (ms.vss-work-web.work…v17_.min.js:1:49860) at t.<computed>.RuleEngine.evaluateFields (ms.vss-work-web.work…v17_.min.js:1:48959) at i.evaluateFields (ms.vss-work-web.work…17_.min.js:1:142335) at i.evaluate (ms.vss-work-web.work…17_.min.js:1:142219) at i.load (ms.vss-work-web.work…17_.min.js:1:152699) at i.evaluate (ms.vss-work-web.work…v17_.min.js:1:37345) at t.<computed>.RuleEngine._evaluateFieldRule (ms.vss-work-web.work…v17_.min.js:1:49623) at ms.vss-work-web.work…v17_.min.js:1:49907 at Array.forEach (<anonymous>) at t.<computed>.RuleEngine._evaluateFieldRule (ms.vss-work-web.work…v17_.min.js:1:49860) at t.<computed>.RuleEngine.evaluateFields (ms.vss-work-web.work…v17_.min.js:1:48959) at i.evaluateFields (ms.vss-work-web.work…17_.min.js:1:142335) at i.evaluate (ms.vss-work-web.work…17_.min.js:1:142219) at i.load (ms.vss-work-web.work…17_.min.js:1:152699) at new i (ms.vss-work-web.work…17_.min.js:1:121465)
问题描述
开发Azure Boards扩展时突然触发上述规则引擎错误,未手动修改过任何工作项规则,排查无头绪,求可能原因及解决方法。
可能原因
- 迭代节点不存在:项目中名为
extension_dev\Sprint 1的迭代被删除、重命名或路径变更,导致依赖该迭代的工作项规则无法找到节点。 - 扩展触发规则评估:扩展作为工作项表单的自定义页面,加载时会触发所有工作项规则的评估,其中某条规则引用了已失效的迭代。
- 缓存不一致:浏览器或Azure DevOps服务端缓存未更新,导致规则仍引用已不存在的迭代信息。
- SDK版本兼容性:使用的
azure-devops-ui或azure-devops-extension-sdk版本与Azure DevOps服务版本不匹配,引发规则引擎逻辑异常。
解决方法
检查迭代结构
进入项目设置→“项目配置”→“迭代”,确认是否存在extension_dev\Sprint 1迭代,若已删除/改名,更新对应工作项规则中的迭代引用。排查工作项规则
进入项目设置→“工作项规则”,逐一检查所有规则的条件和操作,找到引用extension_dev\Sprint 1的规则,修改为有效迭代或删除无效规则。清除缓存
- 浏览器端:按
Ctrl+Shift+R强制刷新页面,或清除浏览器缓存。 - Azure DevOps端:点击页面右上角用户头像→“清除缓存”。
- 浏览器端:按
调整SDK版本
当前azure-devops-ui版本(2.237.0)与azure-devops-extension-api(4.235.0)版本不匹配,尝试将azure-devops-ui降级到2.235.x版本,保持依赖版本一致,然后重新编译扩展。定位具体规则
使用浏览器开发者工具,在报错的i.validate方法处添加断点,查看调用栈中触发规则的具体信息,定位到对应规则ID后去项目设置中修改。
最小复现示例(MRE)核心文件
page.html
<!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <body> <div id="root"></div> <script type="text/javascript" src="page.js" charset="utf-8"></script> </body> </html>
page.tsx
import * as React from "react"; import * as SDK from "azure-devops-extension-sdk"; import "azure-devops-ui/Core/override.css"; import { showRootComponent } from "../Common"; import { Page } from "azure-devops-ui/Page" export class MainComponent extends React.Component<any, any> { constructor(props: any) { super(props); } public async componentDidMount() { await SDK.init(); } public render(): JSX.Element { return ( <Page className="main-component flex-grow"> </Page> ); } } showRootComponent(<MainComponent />);
package.json
{ "name": "<publisher>-ado-extension-dev", "version": "1.0.0", "description": "", "main": "index.js", "scripts": { "clean": "rimraf ./dist ./out", "compile": "npm run clean && webpack --mode development", "start": "webpack-dev-server --mode development", "package": "npm run compile && tfx extension create --manifest-globs vss-extension.json --output-path out --rev-version" }, "keywords": [], "author": "", "license": "ISC", "dependencies": { "azure-devops-extension-api": "^4.235.0", "azure-devops-extension-sdk": "^4.0.2", "azure-devops-ui": "^2.237.0", "react": "^16.8.1", "react-dom": "^16.8.1" }, "devDependencies": { "@types/node": "^20.12.7", "@types/react": "^18.2.79", "@types/react-dom": "^18.2.25", "base64-inline-loader": "^2.0.1", "copy-webpack-plugin": "^12.0.2", "css-loader": "^7.1.1", "file-loader": "^6.2.0", "globals": "^15.3.0", "node-sass": "^9.0.0", "rimraf": "^5.0.5", "sass-loader": "^14.2.1", "style-loader": "^4.0.0", "tfx-cli": "^0.17.0", "ts-loader": "^9.5.1", "typescript": "^5.4.5", "webpack": "^5.91.0", "webpack-cli": "^5.1.4", "webpack-dev-server": "^5.0.4" } }
vss-extension.json
{ "manifestVersion": 1, "id": "<publisher>-mre-dev", "name": "DevOps Extentsion MRE", "publisher": "<publisher>", "version": "0.0.5", "description": "MRE for Devops Extension", "public": false, "categories": ["Azure Boards"], "targets": [ { "id": "Microsoft.VisualStudio.Services" } ], "demands": [ "api-version/3.0" ], "icons": { "default": "static/images/logo.png" }, "scopes": [ "vso.work_write" ], "contributions": [ { "id": "extension-mre", "type": "ms.vss-work-web.work-item-form-page", "description": "MRE for the DevOps Extension", "targets": [ "ms.vss-work-web.work-item-form" ], "properties": { "name": "MRE", "uri": "dist/page/page.html" } } ], "files": [ { "path": "static", "addressable": true }, { "path": "dist", "addressable": true } ] }
tsconfig.json
{ "compilerOptions": { "target": "es5", "lib": ["es5", "es6", "dom"], "jsx": "react", "experimentalDecorators": true, "emitDecoratorMetadata": true, "module": "commonjs", "moduleResolution": "node", "esModuleInterop": true, "forceConsistentCasingInFileNames": true, "strict": true, "noImplicitAny": true, "noImplicitThis": true, "skipLibCheck": true } }
webpack.config.js
const path = require("path"); const fs = require("fs"); const CopyWebpackPlugin = require("copy-webpack-plugin"); const entries = {}; const srcDir = path.join(__dirname, "src"); fs.readdirSync(srcDir) .filter(dir => fs.statSync(path.join(srcDir, dir)).isDirectory()) .forEach(dir => (entries[dir] = "./" + path.join("src", dir, dir))); module.exports = { target: "web", entry: entries, output: { filename: "[name]/[name].js", }, devtool: "inline-source-map", devServer: { server: { type: "https" }, port: 3000, static: { directory: path.join(__dirname, "dist"), } }, resolve: { extensions: [".ts", ".tsx", ".js"], alias: { "azure-devops-extension-sdk": path.resolve( "node_modules/azure-devops-extension-sdk" ) } }, stats: { warnings: false }, module: { rules: [ { test: /\.tsx?$/, use: "ts-loader" }, { test: /\.scss$/, use: [ "style-loader", "css-loader", "azure-devops-ui/buildScripts/css-variables-loader", "sass-loader" ] }, { test: /\.css$/, use: ["style-loader", "css-loader"] }, { test: /\.woff$/, use: [ { loader: "base64-inline-loader" } ] }, { test: /\.html$/, use: "file-loader" } ] }, plugins: [new CopyWebpackPlugin({ patterns: [ { from: "**/*.html", context: "src" }, //{ from: "azure-devops-extension-sdk/*.js", context: "node_modules"} ] })] };
内容的提问来源于stack exchange,提问作者Clemens Kmentt
相关产品推荐
相关产品推荐

