規則和規則評估

Azure DevOps Services |Azure DevOps Server 2022 - Azure DevOps Server 2019 |TFS 2018

規則可用來設定或限制工作專案欄位的值指派。 有兩種主要類型的規則:自動產生的規則和針對進程或專案定義的自訂規則。 自動產生的規則可將應該以標準方式運作的區域新增自訂規則的需求降到最低。

您可以定義自訂規則以支援您的商務使用案例。 視欄位的資料類型而定,您可以針對哪些資料可以輸入該欄位來設定各種限制。 您可以指定挑選清單 (下拉式功能表) 的值、設定預設值、清除項目,或限制變更。 透過條件式規則,您可以根據不同欄位值之間的相依性,將規則套用至欄位。 您也可以限制可修改欄位的人員,或將規則的範圍設為僅套用至群組。

請閱讀本文以瞭解下列內容:

  • 系統如何套用自動產生的規則
  • 在系統欄位上定義自訂規則的限制
  • 您可以套用的不同自訂規則類型
  • 評估規則的方式
  • 針對繼承程式所定義的規則與內部部署 XML 進程之間的差異
  • 為何您應該將您定義的自訂規則數目降到最低

在定義自訂規則之前,請閱讀設定和自訂Azure Boards,以深入瞭解如何自訂Azure Boards以符合您的業務需求。

提示

將您為 WIT 定義的規則數目降到最低。 雖然您可以為 WIT 建立多個規則,但當使用者新增和修改工作專案時,新增規則可能會對效能造成負面影響。 當使用者儲存工作專案時,系統會驗證與其工作專案類型欄位相關聯的所有規則。 在某些情況下,規則驗證運算式太複雜,無法評估 SQL。

自動產生的規則

自動產生的規則可將應該以標準方式運作的區域新增自訂規則的需求降到最低。

狀態轉換規則

繼承的進程會針對每個自訂工作專案類型和新增至工作流程的自訂狀態,動態產生整個一組任意對任意狀態轉換規則。 從任何狀態轉換為任何狀態的有效狀態。

對於內部部署 XML 進程,您必須在工作專案類型定義的 區段中指定有效的轉換 WORKFLOW

狀態轉換和依/日期欄位規則

[依據/日期] 欄位會對應至 [建立者/日期]、[ 依日期啟動]、[ 依/日期解析] 和 [ 關閉日期]。

針對繼承的進程,當您將工作專案從某個狀態轉換為另一個狀態時,會自動設定或清除這些欄位。 [變更依據/日期] 欄位不會包含在內,因為它們會隨著每個工作專案儲存而更新,而且與狀態轉換無關。

管理這些欄位的預設規則和行為包括:

  1. [已關閉] 狀態一律包含在 [已完成] 狀態類別中。
  2. [已完成] 狀態類別無法設定,且與一個和只有一個 State 相關聯。
  3. 已關閉 狀態一律為敏捷式和 CMMI 程式 關閉 ,且一律為 Scrum 和基本程式 完成
  4. 這些規則的自動產生會受到地區設定的影響,因為規則條件包含已當地語系化的狀態名稱。 系統會針對不同的地區設定產生不同的規則。
  5. 這些欄位的自動產生規則只會針對包含這些欄位的工作專案類型指定。 工作專案類型可能不包含其中一或多個欄位。
  6. 當工作專案類型具有自訂狀態,或工作專案類型為自訂工作專案類型時,需要這些規則。
  7. 這些規則僅適用于繼承的進程;它們永遠不會針對裝載的 XML 或內部部署 XML 進程產生。

工作流程狀態會與狀態類別相關聯,以支援工作流程看板上的工作流程。 若要深入瞭解,請參閱待辦專案 和麵板如何使用工作流程狀態和狀態類別

狀態變更日期欄位規則

這些規則在技術上比關閉者/關閉日期規則簡單很多,因為它們不相依于任何特定狀態。 對於任何工作專案類型,相同的規則一律會運作。 它們必須自動產生,因為某些 OOB 工作專案類型不包含 [狀態變更日期] 欄位,因此當使用者將此欄位新增至自訂工作專案類型時,也必須自動產生這些規則。 這裡也適用于「關閉依據/關閉日期」規則的相同原則。

自訂規則

所有自訂規則都是選擇性的。 針對繼承的進程,您可以指定由條件加動作所組成的規則。 針對內部部署 XML 程式,您可以指定欄位或工作流程內的規則。

這兩個進程之間沒有一對一的對應。 在某些情況下,XML 元素規則是在繼承進程的 [ 編輯欄位 ] 對話方塊中定義,而不是規則。 繼承的進程不支援其他 XML 元素,例如 FROZENMATCHNOTSAMEAS 、 。

請注意:

  • 規則一律會強制執行,而不只是當您與表單互動,也會在與其他工具互動時強制執行。 例如,將欄位設定為唯讀,不僅會在工作專案表單上套用規則,也會透過 API 和 Excel Azure DevOps Server增益集套用規則。
  • 繼承的進程專案會指定條件和動作,以建立完整的規則。 XML 元素不會區分這些差異。
  • 欄位規則不支援指派兩個其他欄位的總和或執行其他數學計算的值。 不過,您可以透過 TFS 匯總工具 (Web 服務) Marketplace 擴充功能,找到符合您需求的解決方案。 另請參閱 工作和其他欄位的匯總
  • 您可能會發現使用 Marketplace 延伸模組將自訂規則套用至欄位的其他解決方案,例如 工作專案表單控制項程式庫延伸模組

規則組合

對於繼承的進程,每個規則都包含兩個部分:條件和動作。 條件會定義必須符合才能套用規則的情況。 動作會定義要執行的作業。 針對大部分的規則,您可以為每個規則指定最多兩個條件和 10 個動作。 所有自訂規則都需要符合所有條件才能執行。

例如,您可以根據指派給狀態的值和另一個欄位,建立必要的欄位。 例如:

   (Condition) When a work item State isActive
   (Condition) And when the value of值區域 = 業務
   (Action) Then make required劇本點

注意

目前,狀態轉換規則只支援一個條件。 如果您要根據狀態套用規則,請參閱 將規則套用至工作流程狀態

下表摘要說明所選 [條件] 中可用的動作。

Condition

支援的動作

設定域值或進行必要或唯讀

條件,工作專案已建立

動作、工作專案已建立

根據狀態限制轉換

條件,工作專案已移動

動作,根據狀態限制交易。

隱藏欄位,或根據狀態和使用者或群組成員資格將欄位設為唯讀或必要

條件,使用者群組成員資格

動作,根據狀態和成員資格限制交易。

根據 和 使用者或群組成員資格,設定欄位屬性或限制狀態轉換

條件,使用者群組成員資格

動作,根據狀態和成員資格限制交易。

如果定義太多規則,會發生什麼事

每個專案都會定義單一 SQL 運算式,以在建立或更新工作專案時驗證工作專案。 此運算式會隨著您為專案定義之所有工作專案類型所指定的規則數目而成長。 針對欄位指定的每個行為限定詞,都會增加子運算式的數目。 巢狀規則、僅適用于轉換或條件設定為其他欄位值的規則,會導致將更多條件新增至 IF 語句。 一旦運算式達到特定大小或複雜度,SQL 就無法再評估它,並產生錯誤。 移除某些 WIT 或排除某些規則,可以解決錯誤。

您可以指定挑選清單 (下拉式功能表) 的值、設定預設值、清除項目,或限制變更。 使用條件式規則,您可以根據不同欄位值之間的相依性,將規則套用至欄位。 您也可以限制可修改欄位的人員,或將規則的範圍設為僅套用至群組。

工作專案規則不存在為單一集合。 這些規則實際上是以動態方式產生,並從不同的資料來源合併。 合併邏輯是簡單的規則,合併相同的規則,但不要修剪衝突的規則。

略過規則

一般而言,當使用者修改工作專案時,規則引擎會驗證所有工作專案。 不過,為了支援特定案例,獲派工作 專案更新專案層級許可權略過規則 的使用者,可以儲存工作專案,而不需要評估規則。

規則可以透過兩種方式之一略過。 第一個是透過 工作專案 - 更新 REST API ,並將 參數設定 bypassRulestrue 。 第二個是透過用戶端物件模型,方法是在略過rules 模式中初始化 (WorkItemStore 初始化 WorkItemStoreFlags.BypassRules) 。

系統欄位和自訂規則

系統欄位具有 System。名稱 參考名稱,例如 System.TitleSystem.State

下列系統欄位必須具有值: 區域識別碼變更日期建立日期建立日期建立者、狀態原因

規則引擎會將設定條件或動作限制為系統欄位,但如下所示:

  • 您可以將 [狀態 ] 和 [ 原因] 欄位設為唯讀。
  • 您可以將大部分規則套用至 [標題]、[ 指派給]、[ 描述] 和 [變更者] 欄位。

如果您在繼承程式的規則使用者介面的下拉式功能表中看不到列出的欄位,這就是原因。 例如,如果您嘗試根據條件 (System.AreaPath) 唯讀 則 [區域路徑] 欄位不適用於選取範圍。 即使您能夠指定系統欄位,規則引擎仍可能會限制您儲存規則。

預設和複製規則

預設和複製規則會修改工作專案欄位的值。 他們會定義執行時間行為和條件約束,例如指定預設值、清除欄位、要求定義欄位等等。

您可以根據目前使用者的群組成員資格來限制這些規則的套用,如 使用者或群組成員資格規則限制中所述。

大部分的規則動作都可以在任何條件選取的情況下套用。

繼承的進程動作

說明

Copy the value from...

指定另一個欄位,其中包含要複製到目前欄位中的值。

Clear the value of...

清除欄位所包含的任何值。

Use the current time to set the value of ...

根據目前使用者的時間設定,設定欄位的時間。

條件約束規則

條件約束規則會限制變更欄位的值。 他們會定義工作專案的有效狀態。 每個條件約束都會在單一欄位上運作。 條件約束會在工作專案儲存的伺服器上進行評估,如果違反任何條件約束,則會拒絕儲存作業。

您可以根據目前使用者的群組成員資格來限制這些規則的套用,如 使用者或群組成員資格規則限制中所述。

大部分的規則動作都可以在任何條件選取的情況下套用。

繼承的進程動作

說明

Hide the field...
只有在選取群組成員資格條件時,才能使用。

指定不要在工作專案表單上顯示欄位,基本上移除目前使用者變更域值的能力。

Make read-only

防止對欄位進行任何修改。 您可能想要在某些情況下套用這項規則。 例如關閉工作項目之後,您想要將欄位設為唯讀,以保留資料供報告之用。
若要指定欄位預設值為唯讀,請在 [編輯欄位] 對話方塊的 [ 選項] 索引 標籤中指定 。

Make required

使用者必須指定欄位值。 使用者必須指派值給所有必要欄位,才能儲存工作項目。
若要指定欄位預設值,請在 [編輯欄位] 對話方塊中指定 [ 選項] 索引 標籤。

挑選清單

挑選清單會定義使用者可以或無法為 [字串] 或 [整數] 欄位選擇的值。 在挑選清單中定義的值會出現在工作項目表單和查詢編輯器中。

對於繼承的程式,挑選清單是透過 [編輯欄位] 對話方塊來定義。

編輯欄位對話方塊

說明

挑選清單欄位的定義索引標籤

定義欄位的允許值清單。 允許的值是在工作項目表單和查詢產生器的欄位清單中可供選取的值。 您必須從這些值中選取一個。

核取 [選項] 索引標籤內的[允許使用者輸入自己的值] 核取方塊,以允許使用者指定自己的專案

定義欄位的建議值清單。 建議的值是在工作項目表單和查詢產生器的欄位清單中可供選取的值。 除了清單中的值之外,您也可以輸入其他值。

條件域值或變更

條件式規則會根據等於或不等於特定值的域值,或變更為或未對特定欄位的值進行變更,來指定動作。 一般而言,條件式規則會先套用到無條件規則。 當多個條件式規則評估為 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 ...

指定要在特定欄位上採取的動作。

使用者或群組成員資格規則限制

您可以根據目前使用者的成員資格來限制規則的應用程式。 我們建議您將規則的範圍設定為 Azure DevOps 安全性群組,而不是單一使用者,不過您可以指定後者。 若要將規則範圍設定為多個群組,您必須建立父 Azure DevOps 群組,其中包含您想要使用的群組集。

程式實作

提示

若要避免可能發生的規則評估問題,請指定 Azure DevOps 安全性群組,而不是 Azure Active Directory 或 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 ...

使用權杖來參考使用者或群組

身分識別或人員選擇器欄位可以接受參考使用者和群組的值。 當您將規則限制為群組時,會指出群組的網域或範圍。 對於某些值,您可以使用語彙基元。

權杖的範例包括:

  • [ProjectName],例如 [Fabrikam]、[FabrikamFiber]、[MyProject]
  • [OrganizationName], 例如 [fabrikam], [myorganization]
  • [CollectionName], 例如 [fabrikam], [myorganization]

若要瞭解專案或組織可用的範圍,請移至 [ 專案 > 設定許可權 > 群組 ] 或 [ 組織設定 > 許可權 > 群組 ] 頁面,您可以視需要篩選清單。 例如,下圖顯示根據 Azure DevOps篩選清單的前四個專案。 若要深入瞭解,請參閱 變更專案層級許可權變更專案集合層級許可權

篩選的許可權群組清單螢幕擷取畫面。

若要深入瞭解預設安全性群組,請參閱 許可權和群組

規則評估

根據修改工作專案之使用者或群組成員資格來指定條件的規則,會以兩種方式之一進行評估。 評估規則時,應用程式必須檢查該使用者是否為指定群組的成員,以判斷規則是否套用至目前使用者。

  • 從入口網站、REST API 或 azure boards 命令修改工作專案時,會提出對 Azure Active Directory 或 Active Directory 的要求。 這項作業不會發生任何問題。
  • 使用 WIT 用戶端物件模型從 Visual Studio、Excel 或其他自訂工具修改工作專案時,評估成員資格的要求是以用戶端快取為基礎。 用戶端快取不知道 Active Directory 群組。

注意

使用 GIT 之專案的 Visual Studio 2019 Team Explorer 已重新撰寫為使用 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 由使用者執行。

  1. 從 Azure DevOps 用戶端,例如入口網站或 Visual Studio Team Explorer,使用者會建立新的工作專案或編輯現有的工作專案。

  2. 填入欄位預設值。 針對所有欄位,套用指派給不屬於條件子句之欄位的任何預設值。

  3. 複製或設定域值。 針對所有欄位,套用任何規則來複製值,或設定不屬於條件子句一部分的域值。

  4. 針對符合 [條件式規則] 的所有欄位,套用規則來設定或複製域值。

  5. 對於符合 [當非條件式規則] 的所有欄位,請套用規則來設定或複製域值。

    系統一律會在 [未使用] 規則之前處理[何時] 規則。

  6. 對於自步驟 1 起變更其值的所有欄位,以及包含 變更 規則的所有欄位,請套用規則來設定或複製域值。

  7. 允許使用者開始編輯。

  8. 使用者變更欄位值,然後將焦點移出欄位。

  9. 處理符合新值之欄位的任何 When 規則。

  10. 處理符合新值之欄位的任何 When Not 規則。

  11. 處理符合新值之欄位的任何 [變更時 ] 規則。

  12. 將編輯能力歸還給使用者。

  13. 使用者會將變更儲存至資料存放區。

  14. 針對所有欄位,套用針對條件式規則直接或間接定義欄位的任何 Use the current time to set the value of ... 動作。