You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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服务版本不匹配,引发规则引擎逻辑异常。

解决方法

  1. 检查迭代结构
    进入项目设置→“项目配置”→“迭代”,确认是否存在extension_dev\Sprint 1迭代,若已删除/改名,更新对应工作项规则中的迭代引用。

  2. 排查工作项规则
    进入项目设置→“工作项规则”,逐一检查所有规则的条件和操作,找到引用extension_dev\Sprint 1的规则,修改为有效迭代或删除无效规则。

  3. 清除缓存

    • 浏览器端:按Ctrl+Shift+R强制刷新页面,或清除浏览器缓存。
    • Azure DevOps端:点击页面右上角用户头像→“清除缓存”。
  4. 调整SDK版本
    当前azure-devops-ui版本(2.237.0)与azure-devops-extension-api(4.235.0)版本不匹配,尝试将azure-devops-ui降级到2.235.x版本,保持依赖版本一致,然后重新编译扩展。

  5. 定位具体规则
    使用浏览器开发者工具,在报错的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 22:44:52