规则和规则评估
本文内容
Azure DevOps Services | Azure DevOps Server 2022 - Azure DevOps Server 2019
规则用于设置或限制对工作项字段的值分配。 有两种主要的规则类型:自动生成的规则和为流程或项目定义的自定义规则。 自动生成的规则可最大程度地减少为应按标准方式工作的领域添加自定义规则的需要。
定义自定义规则以支持业务用例。 根据字段的数据类型,你可以针对能够输入该字段的数据设置各种限制。 你可以为选取列表(下拉菜单)指定值、设置默认值、清除条目或限制更改。 通过条件规则,你可以基于不同字段值之间的依赖关系对字段应用规则。 你还可以限制能修改字段的人员或将规则的作用域限制为仅适用于组。
阅读本文以了解以下内容:
系统如何应用自动生成的规则
对系统字段自定义规则的定义的限制
可以应用的不同类型的自定义规则
如何评估规则
为继承进程定义的规则与本地 XML 进程之间的差异
为何应最大程度地减少定义的自定义规则数
在定义自定义规则之前,请阅读 “配置和自定义 Azure Boards”,大致了解如何自定义 Azure Boards 以满足业务需求。
提示
最大程度地减少为 WIT 定义的规则数。 虽然可以为 WIT 创建多个规则,但当用户添加和修改工作项时,添加规则可能会对性能产生负面影响。 当用户保存工作项时,系统将验证与其工作项类型字段关联的所有规则。 在某些情况下,规则验证表达式过于复杂,SQL 无法计算。
自动生成的规则
自动生成的规则可最大程度地减少为应按标准方式工作的领域添加自定义规则的需要。
状态转换规则
继承的进程会针对添加到工作流的每个自定义工作项类型和自定义状态动态生成整个任意到任意状态转换规则集。 从任何状态转换到任何状态都有效。
对于本地 XML 进程,必须在工作项类型定义的节中 WORKFLOW
指定有效的转换。
状态转换和按/日期字段规则
“按/日期”字段对应于“创建者/日期”、“激活者/日期 ”、“已解决日期 ”和“关闭日期”。
对于继承的进程,在将工作项从一个状态转换为另一个状态时,将自动设置或清除这些字段。 更改的依据/日期字段不包含,因为它们随每个工作项保存而更新,并且与状态转换无关。
管理这些字段的默认规则和行为包括:
关闭 状态始终包含在“已完成”状态类别中 。
“ 已完成 ”状态类别不可配置,并且与一个状态相关联,并且仅与一个状态相关联。
对于敏捷和 CMMI 进程,此已关闭状态始终为 Closed ,并且始终为 Scrum 和 Basic 进程完成 。
这些规则的自动生成受区域设置的影响,因为规则条件包含已本地化的状态名称。 系统为不同的区域设置生成不同的规则。
仅为包含这些字段的工作项类型指定自动生成的规则。 工作项类型可能不包含其中一个或多个字段。
当工作项类型具有自定义状态或工作项类型为自定义工作项类型时,需要这些规则。
这些规则仅适用于继承的进程;它们永远不会为托管 XML 或本地 XML 进程生成。
工作流状态与状态类别相关联,以支持板上的工作流。 有关详细信息,请参阅如何在积压工作和面板中使用工作流状态和状态类别 。
状态更改日期字段规则
这些规则在技术上比关闭日期/关闭日期规则要简单得多,因为它们不依赖于任何特定状态。 对于任何工作项类型,相同的规则将始终正常工作。 它们需要自动生成,因为某些 OOB 工作项类型不包含状态更改日期字段,因此当用户将此字段添加到自定义工作项类型时,也需要自动生成这些规则。 此处也适用于“已关闭日期”/“关闭日期”规则的相同原则。
自定义规则
所有自定义规则都是可选的。 对于继承的进程,可以指定一个规则,该规则由条件加操作组成。 对于本地 XML 进程,可以指定字段或工作流中的规则。
两个进程之间没有一对一映射。 在某些情况下,XML 元素规则是在 继承进程的“编辑”字段 对话框中定义的,而不是作为规则定义。 继承的进程中不支持其他 XML 元素,例如 FROZEN
,MATCH
NOTSAMEAS
。
注意以下事项:
始终强制实施规则,不仅当你与表单交互,而且当与其他工具交互时也是如此。 例如,将字段设置为只读不仅将规则应用于工作项窗体,还通过 API 和 Excel Azure DevOps Server 外接程序应用规则。
继承的进程条目指定条件和操作以生成完整的规则。 XML 元素不区分这些。
字段规则不支持分配其他两个字段的总和或执行其他数学计算的值。 但是,可以通过 TFS 聚合器(Web 服务)市场扩展找到符合需求的 解决方案。 另 请参阅工作和其他字段 的汇总。
你可能会发现使用市场扩展(例如 工作项窗体控件库扩展 )将自定义规则应用于字段的其他解决方案。
规则组合
对于继承的进程,每个规则由两个部分组成:条件和操作。 条件定义必须满足的条件才能应用规则。 操作定义要执行的操作。 对于大多数规则,每个规则最多可以指定两个条件和 10 个操作。 所有自定义规则都需要满足所有条件才能运行。
例如,可以根据分配给状态的值和另一个字段创建所需的字段。 例如:
(Condition) When a work item State is
积极
(Condition) And when the value of
值区域 = 商
(Action) Then make required
故事点
下表总结了所选条件中可用的操作。
隐藏字段或根据状态和用户或组成员身份使字段只读或必需
本地 XML 进程使用 XML 元素定义规则。 所有这些规则元素都可以在工作项类型定义的定义中 FIELD
定义。 除了元素之外 HELPTEXT
,还可以指定这些规则,以在工作流转换期间或作为 (全局工作流) 元素中的 FIELD
子元素产生影响。
注意
TFS 2018 及更高版本不支持该 VALIDUSER
元素。
应用字段规则的位置
如果希望规则在整个工作项的整个生命周期内应用于某个字段,请在节中 FIELD
指定它。 例如,在 bug 关闭之前,新 bug 和活动 bug 所需的字段仍是必需的。 否则,如果希望根据状态、原因或转换的更改应用,请在节中 WORKFLOW
指定它。
状态 (System.State ) 和 Reason (System.Reason ) 字段在节中 WORKFLOW
定义。 可以指定要在更改状态、选择原因或特定转换期间应用于字段的大多数字段规则。 有关详细信息,请参阅 更改工作项类型的 工作流。
否则,请指定仅在状态更改期间评估的规则。 这些规则在元素下的节中WORKFLOW
STATE
REASON
TRANSITION
定义。 除 之外 HELPTEXT
的所有规则都可以在 (Workflow) 元素中 FIELD
应用。
字段规则是累加规则。 也就是说,可以为规则引擎评估的同一字段指定四组规则。
无论工作项在其状态模型中的工作项的位置如何,工作项类型特定的 规则都适用。 例如, <REQUIRED \>
规则执行以下检查:
"MyField Value" != NULL
状态特定的 规则在处于特定状态时限定为工作项实例。 当以下条件为 true 时,将强制实施特定于状态的规则:
State field value == "MyState" && "MyField Value" != NULL
为特定转换指定的转换特定 规则的范围限定为正在进行特定转换的工作项。 如果满足以下条件,则强制实施这些规则:
State field value == "ToState" &&
"Previous State Before Edit/New" == "FromState"
&& "MyField Value" != NULL
你为特定原因指定的特定于 原因的规则的范围限定为特定转换的特定原因。 如果满足以下条件,则会处理它们:
Reason field == "MyReason" &&
State field value == "ToState" &&
"Previous State Before Edit/New" == "FromState" && "MyField Value" != NULL
以下示例限制在工作项处于活动状态时修改客户严重性字段。
<STATE name="Active">
<FIELDS>
<FIELD refname="MyCorp.Severity" >
<READONLY />
</FIELD>
</FIELDS>
</STATE>
定义过多规则时会发生什么情况
每个项目定义一个 SQL 表达式,以便在创建或更新工作项时验证工作项。 此表达式随为项目定义的所有工作项类型指定的规则数增长。 为字段指定的每个行为限定符会导致子表达式的数量增加。 嵌套规则、仅适用于转换或条件为其他字段的值的规则,会导致将更多条件添加到 IF
语句中。 表达式达到特定大小或复杂性后,SQL 将无法再对其进行计算并生成错误。 删除某些 WIT 或消除某些规则可以解决此错误。
你可以为选取列表(下拉菜单)指定值、设置默认值、清除条目或限制更改。 通过条件规则,你可以基于不同字段值之间的依赖关系对字段应用规则。 你还可以限制能修改字段的人员或将规则的作用域限制为仅适用于组。
工作项规则不存在为单个集合。 这些规则实际上是从不同的数据源动态生成和合并的。 合并逻辑是一个简单的规则,合并相同的规则,但不剪裁冲突规则。
绕过规则
通常,当用户修改工作项时,规则引擎会验证所有工作项。 但是,为了支持某些方案,分配了 “绕过”工作项规则更新 项目级权限的用户可以保存工作项,而无需评估规则。
可以通过以下两种方式之一绕过规则。 第一个是通过 工作项 - 更新 REST API 并将参数设置为 bypassRules
true
。 第二种是通过客户端对象模型(通过旁路模式初始化)进行初始化(初始化 WorkItemStore
方式 WorkItemStoreFlags.BypassRules
)。
系统字段和自定义规则
系统字段具有“系统”。名称 引用名称,例如 System.Title 和 System.State 。
以下系统字段必须具有一个值:区域 ID 、更改日期、创建日期 、创建者、 状态 和原因 。
规则引擎将设置条件或操作限制为系统字段,但如下所示:
可以将 “状态 ”和 “原因” 字段设为只读。
可以将大多数规则应用于“标题 ”、“分配给”、“ 说明 ”和“更改者” 字段。
如果未看到继承过程的规则用户界面下拉菜单中列出的字段,这就是原因。 例如,如果尝试根据条件使 区域路径(System.AreaPath)只读,则“区域路径 ”字段不适用于选择。 即使能够指定系统字段,规则引擎也可以限制你保存规则。
默认规则和复制规则
默认规则和复制规则修改工作项字段的值。 它们定义运行时行为和约束,例如指定默认值、清除字段、需要定义字段等。
可以根据当前用户的组成员身份限制来限制这些规则的应用,如用户或组成员身份规则限制中所述 。
大多数这些规则操作都可以随任何条件的选择一起应用。
Use the current time to set the value of ...
这些规则支持设置默认值、将值从一个字段复制到另一个字段,或强制实施字段值以匹配规定的模式。 有关语法结构和示例,请参阅 “定义默认值”或将值复制到字段 。
当用户创建或修改工作项时,将指定值复制到字段。
<FIELD refname="MyCorp.Status" name="Status" type="String">
<COPY from="value" value=" " />
</FIELD>
指定用户创建或修改工作项时为空的字段的值。 如果字段已有值,则 DEFAULT
忽略规则。 仅当字段的值当前为空时 Is
,默认规则才会执行。 支持的值包括当前时间()、当前用户(from = "clock"
from = "currentuser"
)、文本值(from = "value" value = "literal"
)或另一字段的值(from = field field = "referenceNameField"
)。
<FIELD refname="MyCorp.Priority" name="Priority" type="String"
<HELPTEXT>Specify the severity of the problem</HELPTEXT
<ALLOWEDVALUES
<LISTITEM value="P1"/
<LISTITEM value="P2"/
<LISTITEM value="P3"/
</ALLOWEDVALUES
<DEFAULT from="value" value="P3"/
</FIELD
指定要定义字段值的服务器时钟或当前用户。
<TRANSITION from="New" to="Active">
<ACTIONS>
<ACTION value="Microsoft.VSTS.Actions.StartWork" />
</ACTIONS>
<REASONS>
<DEFAULTREASON value="Work started" />
</REASONS>
<FIELDS>
<FIELD refname="Microsoft.VSTS.Common.ActivatedBy">
<COPY from="currentuser" />
<VALIDUSER />
<REQUIRED />
</FIELD>
<FIELD refname="Microsoft.VSTS.Common.ActivatedDate">
<SERVERDEFAULT from="clock" />
</FIELD>
<FIELD refname="System.AssignedTo">
<DEFAULT from="currentuser" />
</FIELD>
</FIELDS>
</TRANSITION>
约束规则
约束规则限制更改字段的值。 它们定义工作项的有效状态。 每个约束在单个字段上运行。 约束在工作项保存的服务器上进行评估,如果违反任何约束,则会拒绝保存操作。
可以根据当前用户的组成员身份限制来限制这些规则的应用,如用户或组成员身份规则限制中所述 。
大多数这些规则操作都可以随任何条件的选择一起应用。
Hide the field...
仅当选择组成员资格条件时可用。
指定不显示工作项窗体上的字段,实质上是删除当前用户更改字段值的能力。
防止字段完全被修改。 你可能希望在某些条件下应用此规则。 例如,关闭工作项后,你想要使字段只读,以保留数据以供报告。
若要指定字段默认值为只读,请在“编辑字段”对话框“ 选项 ”选项卡中指定。
要求用户指定字段的值。 在为所有必填字段分配值之前,用户无法保存工作项。
若要指定字段默认值,请在“编辑字段”对话框“ 选项 ”选项卡中指定。
定义字段允许的值的列表。 允许的值是可用于在工作项窗体和查询生成器的字段列表中选择的值。 必须从其中一个值中进行选择。
指定值后,防止用户清除某个值的字段。 此元素保留当前字段值,无法清除或将其设为空。
<FIELD refname="MyCorp.Priority" name="Management Priority" type="String">
<CANNOTLOSEVALUE />
</FIELD>
在字段包含值后,阻止用户更改字段的值。 当用户使用该字段中的值保存工作项后,将无法再修改该值。 提交更改后,无法将冻结字段更改为任何非空值。 但是,可以手动清除字段,保存工作项,然后指定其他值。
<FIELD refname="MyCorp.Priority" name="Management Priority" type="String">
<FROZEN not="[Project]\Management Team" />
</FIELD>
清除它包含的任何值的字段,然后在用户保存工作项时将字段设置为只读。 不应与 EMPTY
READONLY
.
EMPTY
主要用于状态转换期间清除 应用于项目正在转换的状态的字段。
<FIELD refname="MyCorp.SubStatus" />
<WHEN field="MyCorp.Status" value="Approve" >
<EMPTY />
</WHEN>
</FIELD>
强制对字符串字段进行的条目符合 指定的字符或数字 模式。 如果定义多个 MATCH
元素,则如果该值与指定的任何模式匹配,则该值被视为有效。 如果至少有一个元素成功,则字段具有有效值。
<FIELD refname="MyCorp.GitHubURL" name="GitHub URL" type="String">
<MATCH pattern="https:\/\/github\.com\/\S+[\.md|\.yml]$"/>
</FIELD>
防止为字段分配与分配给另一个字段的值相同。
<FIELD refname="MyCorp.Status" name="Status" type="String">
<NOTSAMEAS field="MyCorp.SubStatus" />
</FIELD>
定义字段的禁止值列表。 如果多个 ALLOWEDVALUES
和/或 PROHIBITEDVALUES
规则适用于特定字段,则有效值的完整列表是所有允许值列表的交集(或所有内容),如果没有允许的值列表(减号),即设置差异-所有禁止值列表的并集。
防止字段完全被修改。 你可能希望在某些条件下应用此规则。 例如,关闭工作项后,你想要使字段只读,以保留数据以供报告。
请勿与元素一起使用 READONLY
, EMPTY
因为 EMPTY
也使字段是只读的。 合并这些元素可能会产生不一致的结果。
此外,还可以使用 Control
元素 ReadOnly
属性使字段从工作项窗体中显示为只读。 该字段可由其他客户端写入,但不能通过工作项窗体写入。
<FIELD refname="MyCorp.Status" name="Status" type="String">
<READONLY />
</FIELD>
要求用户指定字段的值。 在为所有必填字段分配值之前,用户无法保存工作项。
<FIELD refname="MyCorp.Status" name="Status" type="String">
<REQUIRED />
</FIELD>
选取列表
选取列表定义用户可为字符串或整数字段选择的值。 在选取列表中定义的值显示在工作项窗体和查询编辑器上。
对于继承的进程,选择列表是通过“编辑”字段对话框定义的。
定义字段允许的值的列表。 允许的值是可用于在工作项窗体和查询生成器的字段列表中选择的值。 必须从其中一个值中进行选择。
选中“允许用户在”选项“选项卡中输入自己的值 复选框 ,以允许用户指定自己的条目
定义字段的建议值的列表。 建议的值是可用于在工作项窗体和查询生成器的字段列表中选择的值。 还可以向列表中的值输入其他值。
使用下表中列出的 XML 元素定义选取列表。 有关语法结构和示例,请参阅 “定义选取列表 ”。
可以合并列表,然后展开或收缩列表。 此外,可以根据当前用户的组成员身份限制来限制这些规则的应用,如用户或组成员身份规则限制中所述 。
定义字段允许的值的列表。 允许的值是可用于在工作项窗体和查询生成器的字段列表中选择的值。 必须从其中一个值中进行选择。
定义允许现有值的字段。 此元素允许使用已经存在的字段值,即使它们无效也是如此。 所有新字段值都必须有效。
定义字段的建议值的列表。 建议的值是可用于在工作项窗体和查询生成器的字段列表中选择的值。 还可以向列表中的值输入其他值。
标识字段和验证错误
若要避免在成员离开团队且不再注册为项目参与者时发生验证错误,请包括“已分配的”字段的 ALLOWEXISTINGVALUE 元素。
<FIELD name="Assigned To" refname="System.AssignedTo" type="String" syncnamechanges="true" reportable="dimension">
<HELPTEXT>The user who is working on this work item</HELPTEXT>
<ALLOWEXISTINGVALUE />
<VALIDUSER />
<ALLOWEDVALUES expanditems="true" filteritems="excludegroups">
<LISTITEM value="Active" />
<LISTITEM value="[project]\Contributors" />
</ALLOWEDVALUES>
<DEFAULT from="field" field="System.CreatedBy" />
</FIELD>
条件字段值或更改
条件规则根据字段的值指定操作,该值等于或不等于特定值,或者更改或未对特定字段的值进行更改。 通常,条件规则首先应用于无条件规则。 当多个条件规则的计算结果为 true 时,执行顺序为:When、WhenNot、WhenChanged、WhenNotChanged。
可以为每个字段指定多个条件规则。 但是,只能为每个条件规则指定一个驾驶字段。
The value of ... (equals)
[When]
指定当另一个字段具有特定值时应用于当前字段的一个或多个规则。
A change was made to the value of ...
[WhenChanged]
更改特定字段的值时,将一个或多个规则应用于当前字段。
The value of ... (not equals)
[WhenNot]
当另一个字段没有特定值时,将一个或多个规则应用于当前字段。
No change was made to the value of ...
[WhenNotChanged]
当特定字段的值未更改时,将一个或多个规则应用于当前字段。
Clear the value of ...
Copy the value from ...
Make read-only ...
Make required ...
Set the value of ...
Use the current time to set the value of ...
Use the current user to set the value of ...
以下 XML 元素用于设置评估其他规则时的条件。 可以为每个字段指定多个条件规则。 但是,只能为每个条件规则指定一个驾驶字段。 不能嵌套条件规则。 每个进程模型支持的操作包括下表中列出的操作。
有关语法结构和示例,请参阅 分配基于条件的值和规则 。 可以根据当前用户的组成员身份限制来限制这些规则的应用,如用户或组成员身份规则限制中所述 。
指定当另一个字段具有特定值时应用于当前字段的一个或多个规则。 父元素定义当前字段。
当指定字段具有指定值时,此元素中的规则将应用于当前字段。
指定将一个或多个规则应用于当前字段的条件。 当另一个字段的值在对工作项的修订中更改时,规则将应用于当前字段。 父元素定义当前字段。
指定将一个或多个规则应用于当前字段的条件。 当另一个字段的值发生更改时,规则将应用于当前字段。 父元素定义当前字段。
当指定的字段不包含指定值时,此元素中的规则将应用于当前字段。
指定将一个或多个规则应用于当前字段的条件。 当另一个字段的值在对工作项的修订中未更改时,规则将应用于当前字段。 父元素定义当前字段。
用户或组成员身份规则限制
可以根据当前用户的成员身份限制规则的应用程序。 建议将规则范围限定为 Azure DevOps 安全组,而不是单个用户,不过可以指定后者。 若要将规则限定为多个组,必须创建包含要使用的组集的父 Azure DevOps 组。
进程实现
提示
若要避免可能出现的规则评估问题,请指定 Azure DevOps 安全组,而不是Microsoft Entra ID 或 Active Directory 安全组。 有关详细信息,请参阅 默认规则和规则引擎 。
如下表所示,若要根据当前用户的成员身份限制规则,请指定继承进程的两个条件之一。 这些规则适用于 Azure DevOps 2020 及更高版本。
Current user is a member of group ...
Current user is not member of group ...
Hide the field ...
Make read-only ...
Make required ...
Restrict the transition to state ...
若要根据当前用户的成员身份限制规则,请在规则元素中指定 for
或 not
属性。 指定规则的范围。 若要将规则限定为多个组,必须创建包含要使用的组集的父 Azure DevOps 组。
用于 for
将规则应用于组。 此示例要求初级分析师组中的任何用户完成第二个审批者字段。
<FIELD name="Second Approver">
<REQUIRED for="Example1\Junior Analysts"/>
</FIELD>
用于 not
从规则中排除组。 本示例将“会审说明”字段定义为除会审委员会组中这些用户以外的所有人的只读字段。
<FIELD name="Triage Description">
<READONLY not="[Project]\Triage Committee" />
</FIELD>
for
结合使用并not
同时将规则应用于某些规则,而不是应用于其他规则。 本示例将“严重性”定义为“项目成员”组中用户(而不是 Project Admins 组中的用户)的必需字段。 如果用户在这两个组中, for
将强制实施该语句,并且字段是必需的。
<FIELD name="Severity">
<REQUIRED for="[Project]\Project Members" not="[Global]\Project Admins"/>
</FIELD>
使用令牌引用用户或组
标识或人员选取器字段可以接受引用用户和组的值。 将规则限制为组时,指示组的域或范围。 对于某些值,可以使用令牌。
令牌示例包括:
[ProjectName ],如 [Fabrikam], [FabrikamFiber], [MyProject]
[OrganizationName ],如 [fabrikam], [myorganization]
[CollectionName ],如 [fabrikam], [myorganization]
若要了解项目或组织可用的范围,请转到 “项目设置>权限>组 ”或 “组织设置>权限>组 ”页,可以根据需要筛选列表。 例如,下图显示了基于 Azure DevOps 筛选列表的前四个条目。 有关详细信息,请参阅 “更改项目级权限 ”或 “更改项目集合级权限 ”。
令牌示例包括:
[Project] ,如 [Project]\Contributors, [Project]\Fabrikam Team, [Project]\Project 审批者[Project] 标记指定为项目定义的组。 这可以对应于团队、默认安全组或自定义安全组,或已添加到项目的 Active Directory 组。
[GLOBAL] ,若要引用集合范围的组,例如 [GLOBAL]\Project Collection Administrators Use [GLOBAL] 来引用集合范围的安全组,例如 Project Collection Administrators 组或添加到集合中的 Windows 组。 例如:<FIELD name="Title">
<READONLY for="[GLOBAL]\Project Collection Valid Users"/>
</FIELD>
[Team Foundation] 若要引用服务器范围的组,例如 [Team Foundation]\Team Foundation 管理员,请使用 [Team Foundation] 引用服务器范围的组,例如内置组或添加到服务器级组的 Windows 组。 例如:<FIELD name="Title">
<READONLY for="[Team Foundation]\Team Foundation Valid Users"/>
</FIELD>
[DomainName ] 用于引用服务器范围的组,例如 [Team Foundation]\Team Foundation Administrators 域限定的帐户名称,如以下示例中显示的帐户名称,可用于引用域用户或组。 某些规则仅支持组,不支持引用域用户。
<LISTITEM value="FABRIKAM\Christie Church's Direct Reports"/>
注意
[Project]、[GLOBAL]和 [Team Foundation] 按原样使用。 不会将它们替换为项目、集合或服务器名称的名称。
若要了解可用于项目或集合的范围,请转到“项目设置>权限>组 ”或“集合设置权限>组”> 页。 根据需要筛选列表。 例如,下图显示了基于 Azure DevOps 筛选列表的前四个条目。 有关详细信息,请参阅 “更改项目级权限 ”或 “更改项目集合级权限 ”。
所有用户和组都必须由其中一个令牌限定。 例如,以下 XML 无效,因为它未使用有效的令牌限定指定的组。
<FIELD name="Title">
<READONLY for="Dev Team"/>
</FIELD>
若要了解有关默认安全组的详细信息,请参阅 权限和组
规则评估
根据修改工作项的用户或组成员身份指定条件的规则以两种方式之一进行评估。 评估规则时,应用程序需要通过检查该用户是否是指定组的成员来确定该规则是否适用于当前用户。
从 Web 门户、REST API 或 azure boards 命令修改工作项时,会发出对 Microsoft Entra ID 或 Active Directory 的请求。 此操作不会出现任何问题。
使用 WIT 客户端对象模型从 Visual Studio、Excel 或其他自定义工具修改工作项时,评估成员身份的请求基于客户端缓存。 客户端缓存不知道 Active Directory 组。
注意
使用 GIT 的项目 Visual Studio 2019 团队资源管理器已重新编写为使用 REST API。
若要避免用户从各种客户端更新工作项时出现问题,请指定 Azure DevOps 安全组而不是 Active Directory 组。 可以轻松创建 Azure DevOps 安全组,以对应于 Active Directory 组。 若要了解如何操作,请参阅 添加或删除用户或组,管理安全组 。
注意
WIT 客户端 OM 已弃用。 自 2020 年 1 月 1 日起,在处理 Azure DevOps Services 和 Azure DevOps Server 2020 时不再支持它。
计算规则的顺序
规则通常按照列出规则的顺序进行处理。 但是,所有规则评估的完整顺序并不完全确定。
本部分介绍应用条件、复制和默认规则时的预期行为和交互。
以下步骤按正确的顺序显示 Azure DevOps 执行的交互以及工作项窗体的用户。 用户仅执行步骤 1、8 和 13。
从 Azure DevOps 客户端(例如 Web 门户或 Visual Studio 团队资源管理器)用户创建新的工作项或编辑现有工作项。
填写字段默认值。 对于所有字段,请应用分配给不属于条件子句的字段的任何默认值。
复制或设置字段值。 对于所有字段,请应用任何规则来复制值或设置不属于条件子句的字段的值。
对于具有“当条件规则匹配”的所有字段,应用规则来设置或复制字段值。
对于具有匹配的 When Not 条件规则的所有字段,应用规则来设置或复制字段值。
系统始终在“何时不规则”之前 处理 When 规则。
对于自步骤 1 以来其值已更改且包含 “更改时” 规则的所有字段,请应用规则来设置或复制字段值。
允许用户开始编辑。
用户更改字段值,然后从字段中移动焦点。
处理与新值匹配的字段的任何 When 规则。
处理与新值匹配的字段的任何 When Not 规则。
处理与新值匹配的字段的任何 “更改时” 规则。
向用户返回编辑功能。
用户将更改保存到数据存储。
对于所有字段,应用在条件规则下直接或间接为字段定义的任何 Use the current time to set the value of ...
操作。
规则通常按照列出规则的顺序进行处理。 但是,使用 WHEN 、 DEFAULT 和 COPY 元素时,可能会应用其他行为。 以下步骤按正确的顺序显示 Azure DevOps 执行的交互以及工作项窗体的用户。 用户仅执行步骤 1、8 和 13。
从 Azure DevOps 客户端(例如 Web 门户或 Visual Studio 团队资源管理器)用户创建新的工作项或编辑现有工作项。
填写字段默认值。 对于所有字段,请应用在外部或 WHEN 规则中指定的任何 DEFAULT 规则。
复制字段值。 对于所有字段,请使用 WHEN 子句外部 的任何 COPY 规则。
对于具有 匹配的 WHEN 规则的所有字段,请先执行 DEFAULT 和 COPY 规则。
对于具有 匹配的 WHENNOT 规则的所有字段,请先执行 DEFAULT ,然后在 其中复制 规则。
系统始终在 WHENNOT 规则之前 处理 WHEN 规则。
对于自步骤 1 以来其值已更改且包含 WHENCHANGED 规则的所有字段,请先执行 DEFAULT 和 COPY 规则。
允许用户开始编辑。
用户更改字段值,然后从字段中移动焦点。
为与新值匹配的字段引发任何 WHEN 规则。
为与新值匹配的字段引发任何 WHENNOT 规则。
为与新值匹配的字段引发任何 WHENCHANGED 规则。
向用户返回编辑功能。
用户将更改保存到数据库。
对于所有字段,请执行在 WHEN 或 WHENNOT 规则下 直接或间接为字段定义的 SERVERDEFAULT 操作。
击键条目和规则评估
每次用户通过工作项窗体在字段中输入击键时,系统都会为字段设置一个新值。 这意味着,只要满足规则的先决条件条件,条件规则可能会意外发生。
在下面的 XML 示例中,系统在键入“再次批准”时将 MyCorp.SubStatus 清空,因为 当用户在“已批准”中键入字母“e”时,就会立即发生 WHEN 规则,即使预期的最终值不是“批准”。 出于此原因,请在使用条件规则时仔细思考。
<FIELD refname="MyCorp.SubStatus" />
<WHEN field="MyCorp.Status" value="Approve" >
<EMPTY />
</WHEN>
</FIELD>
相关文章