規則和規則評估
Azure DevOps Services | Azure DevOps Server 2022 - Azure DevOps Server 2019
規則可用來設定或限制工作項目欄位的值指派。 有兩種主要類型的規則、自動產生的規則和針對流程或專案定義的自訂規則。 自動產生的規則可將應該以標準方式運作的區域新增自訂規則的需求降到最低。
您可以定義自訂規則以支援您的商務使用案例。 視欄位的資料類型而定,您可以設定各種限制規定哪些資料可以輸入該欄位。 您可以指定挑選清單 (下拉式功能表) 的值、設定預設值、清除項目,或限制變更。 透過條件式規則,您可以根據不同欄位的值之間的相依性,將規則套用至欄位。 您也可以限制可修改欄位的人員,或將規則的範圍設為僅套用至群組。
請閱讀本文以瞭解下列內容:
- 系統如何套用自動產生的規則
- 限制在系統欄位上定義自訂規則
- 您可以套用的不同自訂規則類型
- 如何評估規則
- 針對繼承程式所定義的規則與內部部署 XML 進程之間的差異
- 為何您應該將您定義的自定義規則數目降到最低
在定義自定義規則之前,請閱讀 設定和自定義 Azure Boards ,以深入瞭解如何自定義 Azure Boards 以符合您的業務需求。
提示
將您為 WIT 定義的規則數目降到最低。 雖然您可以為 WIT 建立多個規則,但當使用者新增和修改工作項目時,新增規則可能會對效能造成負面影響。 當使用者儲存工作項目時,系統會驗證與其工作項目類型欄位相關聯的所有規則。 在某些情況下,規則驗證運算式太複雜,SQL 無法評估。
自動產生的規則
自動產生的規則可將應該以標準方式運作的區域新增自訂規則的需求降到最低。
狀態轉換規則
繼承的進程會針對每個新增至工作流程的自定義工作項目類型和自定義狀態動態產生一組任意對任意狀態轉換規則。 從任何狀態轉換到任何狀態都是有效的。
針對內部部署 XML 進程,您必須在工作項目類型定義的 區段中指定有效的轉換 WORKFLOW
。
狀態轉換和依據/日期欄位規則
[依據/日期] 字段會對應至 [建立者/日期]、[依日期啟動]、[依日期解析] 和 [關閉依據/日期]。
針對繼承的進程,當您將工作專案從某個狀態轉換為另一個狀態時,會自動設定或清除這些字段。 [變更依據/日期] 字段不會包含在內,因為它們會隨著每個工作專案儲存而更新,而且與狀態轉換無關。
管理這些欄位的預設規則和行為包括:
- [已關閉] 狀態一律包含在 [已完成] 狀態類別中。
- [已完成] 狀態類別無法設定,且與一個和只有一個狀態相關聯。
- 對於敏捷式和 CMMI 進程而言,這個已關閉狀態一律為 Closed,而且一律針對 Scrum 和基本程式完成。
- 這些規則的自動產生會受到地區設定的影響,因為規則條件包含當地語系化的狀態名稱。 系統會針對不同的地區設定產生不同的規則。
- 這些欄位的自動產生規則只會針對包含這些欄位的工作項目類型指定。 工作項目類型可能不包含其中一或多個字段。
- 當工作專案類型具有自定義狀態,或工作專案類型是自定義工作項目類型時,需要這些規則。
- 這些規則僅適用於繼承的進程;它們永遠不會針對裝載的 XML 或內部部署 XML 進程產生。
工作流程狀態與狀態類別相關聯,以支援面板上的工作流程。 如需詳細資訊,請參閱 待辦專案和 Boards 中的工作流程狀態和狀態類別。
狀態變更日期欄位規則
這些規則在技術上比關閉依據/關閉日期規則簡單很多,因為它們不相依於任何特定狀態。 對於任何工作項目類型,相同的規則一律會運作。 它們必須自動產生,因為某些 OOB 工作專案類型不包含 [狀態變更日期] 字段,因此當使用者將此字段新增至自定義工作項目類型時,也必須自動產生這些規則。 這裡也適用於 [關閉日期/ 關閉日期] 規則的相同原則。
自訂規則
所有自訂規則都是選擇性的。 針對繼承的進程,您可以指定由條件加動作所組成的規則。 針對內部部署 XML 程式,您可以指定欄位或工作流程內的規則。
這兩個進程之間沒有一對一對應。 在某些情況下,XML 元素規則是在繼承進程的 [編輯字段] 對話框中定義,而不是做為規則。 繼承的行程中不支援其他 XML 元素,例如FROZEN
、 MATCH
NOTSAMEAS
、 。
請注意以下要點:
- 一律會強制執行規則,不僅當您與窗體互動,而且在透過其他工具進行互動時也一樣。 例如,將欄位設定為唯讀,不僅會套用工作項目表單上的規則,也會透過 API 和 Excel Azure DevOps Server 載入宏來套用規則。
- 繼承的進程專案會指定要建立完整規則的條件和動作。 XML 元素不會區分這些元素。
- 欄位規則不支援指派兩個其他欄位的總和或執行其他數學計算的值。 不過,您可以透過 TFS 匯總工具 (Web 服務) Marketplace 擴充功能,找到符合您需求的解決方案。 另 請參閱工作和其他欄位的匯總。
- 您可能會發現使用 Marketplace 延伸模組將自定義規則套用至欄位的其他解決方案,例如 工作專案表單控件連結庫延伸模組。
規則組合
對於繼承的進程,每個規則都包含兩個部分:條件和動作。 條件會定義必須符合才能套用規則的情況。 動作會定義要執行的作業。 針對大部分的規則,您可以為每個規則指定最多兩個條件和10個動作。 所有自定義規則都需要符合所有條件才能執行。
例如,您可以根據指派給狀態的值和另一個字段,建立必要的欄位。 例如:
(Condition) When a work item State is
積極
(Condition) And when the value of
值區域 = 商
(Action) Then make required
故事點
注意
目前,狀態轉換規則只支援一個條件。 如果您要根據狀態套用規則,請參閱 將規則套用至工作流程狀態。
下表摘要說明所選條件中可用的動作。
Condition
支援的動作
設定域值或設定必要或唯讀
根據狀態限制轉換
隱藏欄位或根據狀態和使用者或群組成員資格,將字段設為唯讀或必要
根據和使用者或群組成員資格,設定欄位屬性或限制狀態轉換
如果定義太多規則,會發生什麼事
每個項目都會定義單一 SQL 運算式,以在建立或更新工作專案時驗證工作專案。 此表達式會隨著您為項目定義之所有工作項目類型所指定的規則數目而成長。 針對欄位指定的每個行為限定符都會增加子表達式的數目。 巢狀規則、僅適用於轉換或以其他欄位值為條件的規則,會導致將更多條件新增至 IF
語句。 一旦表達式達到特定大小或複雜度,SQL 就無法再評估它併產生錯誤。 拿掉某些 WIT 或排除某些規則,可以解決錯誤。
您可以指定挑選清單 (下拉式功能表) 的值、設定預設值、清除項目,或限制變更。 透過條件式規則,您可以根據不同欄位的值之間的相依性,將規則套用至欄位。 您也可以限制可修改欄位的人員,或將規則的範圍設為僅套用至群組。
工作項目規則不存在為單一集合。 規則實際上是從不同的數據源動態產生和合併。 合併邏輯是簡單的規則,合併相同的規則,但不會修剪衝突的規則。
略過規則
一般而言,當使用者修改工作專案時,規則引擎會驗證所有工作專案。 不過,為了支援某些案例,指派 工作專案更新 略過規則的使用者可以儲存工作專案,而不需要評估規則。
規則可以透過兩種方式之一略過。 第一個是透過工作 專案 - 更新 REST API ,並將 參數設定 bypassRules
為 true
。 第二個是透過客戶端物件模型,透過以 bypassrules 模式初始化 (使用 WorkItemStoreFlags.BypassRules
初始化 WorkItemStore
)。
系統欄位和自定義規則
系統欄位具有 [系統]。名稱 參考名稱,例如 System.Title 和 System.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
需要使用者指定欄位的值。 用戶必須先將值指派給所有必要的欄位,才能儲存工作專案。
若要指定欄位預設值,請在 [編輯欄位] 對話框的 [選項 ] 索引標籤中指定 。
挑選清單
選擇清單會定義使用者可以或無法為 String 或 Integer 字段選擇的值。 在挑選清單中定義的值會出現在工作專案表單和查詢編輯器上。
對於繼承的程式,挑選清單是透過 [編輯] 欄位對話框來定義。
編輯欄位對話框
說明
挑選清單欄位的定義 索引標籤
定義欄位允許的值清單。 允許的值是可在工作專案表單和查詢產生器之欄位清單中選取的值。 您必須從其中一個值中選取。
核取 [選項] 索引標籤內的 [允許使用者輸入自己的值] 複選框,允許使用者指定自己的專案
定義欄位的建議值清單。 建議的值是可用於在工作專案表單和查詢產生器之欄位清單中選取的值。 您可以在清單中的其他值中輸入其他值。
條件域值或變更
條件式規則會根據欄位的值指定動作,該值等於或不等於特定值,或變更為或未對特定欄位的值進行變更。 一般而言,條件式規則會先套用到無條件規則。 當多個條件式規則評估為 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 安全組,而不是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 ...
使用令牌參考使用者或群組
身分識別或人員選擇器字段可以接受參考使用者和群組的值。 當您將規則限制為群組時,表示群組的網域或範圍。 針對某些值,您可以使用令牌。
權杖的範例包括下列專案:
- [ProjectName],例如 [Fabrikam]、[FabrikamFiber]、[MyProject]
- [OrganizationName],例如 [fabrikam], [myorganization]
- [CollectionName],例如 [fabrikam], [myorganization]
若要瞭解專案或組織可用的範圍,請移至 [項目設定>許可權群組] 或 [組織>設定許可權>>群組] 頁面,您可以視需要篩選清單。 例如,下圖顯示根據 Azure DevOps 篩選清單的前四個專案。 如需詳細資訊,請參閱 變更專案層級許可權 或 變更專案集合層級許可權。
若要深入了解預設安全組,請參閱 許可權和群組
規則評估
根據修改工作專案之使用者的使用者或群組成員資格來指定條件的規則,會以兩種方式之一進行評估。 評估規則時,應用程式必須藉由檢查該使用者是否為指定群組的成員,來判斷規則是否套用至目前使用者。
- 從入口網站、REST API 或 azure boards 命令修改工作專案時,會提出對 Microsoft Entra ID 或 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。
從 Azure DevOps 用戶端,例如入口網站或 Visual Studio Team Explorer,使用者會建立新的工作專案或編輯現有的工作專案。
填入欄位預設值。 針對所有欄位,套用指派給不屬於條件子句之欄位的任何預設值。
複製或設定域值。 針對所有欄位,套用任何規則來複製值,或設定不屬於條件子句之字段的值。
針對所有符合的條件式規則的欄位,套用規則來設定或複製域值。
對於符合 [當非條件式規則] 的所有字段,請套用規則來設定或複製域值。
系統一律會處理 When rules before Before When Not rules。
對於自步驟 1 之後已變更其值的所有欄位,且包含 [變更 時] 規則,請套用規則來設定或複製域值。
允許用戶開始編輯。
用戶變更域值,然後從欄位移動焦點。
處理符合新值之欄位的任何 When 規則。
處理符合新值之欄位的任何 When Not 規則。
處理符合新值之欄位的任何 [變更 時] 規則。
傳回使用者的編輯功能。
用戶會將變更儲存至數據存放區。
針對所有欄位,套用在條件式規則下直接或間接為字段定義的任何
Use the current time to set the value of ...
動作。