作業項目のワークフロー定義(<WORKFLOW>要素)
作業項目定義に含まれるワークフローとは、ある一つの作業項目に定義されている作業そのものがどのような状態と状態遷移を取るかを定義するものです。例えば、新しく作業項目を作成したときは新規作成という状態、次に作業者が割り当てられると作業待ちという状態、実際に作業が開始されると作業中、作業が終了すると完了、などという具合に一つの作業はその進捗状況によって必ず状態を変えています。このときの一つ一つの状態と、新規作成から作業待ちと言った状態の遷移を定義するのが、作業項目のワークフロー定義です。それぞれについて少し細かく見ておきましょう。
作業項目の状態定義
作業項目定義に含まれる状態とは、先ほども書いたとおり、実際に作業が進捗していく中で取り得る、ある時点での状況を示すものです。先ほどの例では、新規作成、作業待ち、作業中、完了という4つの状態が存在していることになります。これを作業項目定義の中に定義する方法ですが、以下の書式で定義します。
<STATE value="新規作成" />
定義自体は至ってシンプルです。value
属性に状態の名前を定義するだけです。ここの理解はなんら問題ないでしょう。ただし、実際には次のリストに示すような定義になることが一般的です。
<STATE value="新規作成"> <FIELDS> <FIELD refname="Microsoft.VSTS.Common.ActivatedBy"> <REQUIERD /> </FIELD> </FIELDS> </STATE>
ここで、増えた<FIELDS>要素配下は、作業項目定義にあるフィールドの規則という機能を利用しているものです。詳細については回を改めて解説しますが、作業項目定義には、フィールドの入力規則を決めるための機能があり、ある特定の状態や状態遷移の場合にその規則を有効にするという機能もあると理解しておいてください。なお、ここでは、状態が新規作成のとき、refname
属性が"Microsoft.VSTS.Common.ActivatedBy"のフィールドは必須入力項目になるという設定がされています。
作業項目の状態遷移定義
先ほどの例では、新規作成から作業待ち、作業待ちから作業中など、ある状態からある状態に状態が変わっていました。作業項目定義に含まれる状態遷移とは、作業項目が取り得るすべての状態遷移のパターンを網羅的に定義しているものです。例えば、作業待ちから作業中に遷移した後、作業中からなんらかの事情で作業待ちに逆遷移する可能性がある場合、それぞれを別に合計2つ定義する必要があります。
さて、実際の定義の仕方ですが、次のようになります。
<TRANSITION from="新規作成" to="作業待ち"> <REASONS> <DEFAULTREASON value="担当者割り当て" /> </REASONS> </TRANSITION>
状態遷移は<TRANSITION>要素を利用して、その中のfrom
属性がto
属性に状態が変わることを示します。ここでfrom
属性、to
属性はそれぞれ、<STATE>要素のvalue
属性に定義されている値の中から選択して同様の文字列にする必要があります。また、状態が変わるには、それ相応の理由があるはずだという観点から、<REASONS>要素を利用して、理由を設定します。<DEFAULTREASON>は、状態遷移させるときに初期値として選ばれる理由で、いくつかの候補から選択したい場合には、以下に示すようにいくつかの<REASON>要素を追加します。
<TRANSITION from="作業中" to="完了" > <REASONS> <DEFAULTREASON value="レビュー終了" /> <REASON value="延期" /> <REASON value="中止" /> </REASONS> </TRANSITION>
いくつかの<REASON>要素を追加する場合でも<DEFAULTREASON>要素は必ず必要になります。もう1点、重要な点があります。それは、作業項目が新しく作られた時の状態遷移を必ず定義しておかなければならないということです。例えば、タスクという作業項目には、リスト6のような定義があります。
<TRANSITION from="" to="アクティブ"> <REASONS> <DEFAULTREASON value="新規" /> </REASONS> </TRANSITION>
<TRANSITION>要素のfrom
属性が空になっているのがデフォルト状態遷移であることを示しています。この定義によって、作業項目が新しく作成されたときにどの状態から開始されるかが決定されます。
確認いただいても分かるように、状態定義も状態遷移定義も、定義そのものはさほど難しくはありません。ですが、どんな状態を取り得て、どんな状態遷移をさせるのかという設計とも言うべきところでは、大いに悩むことが予想されます。というのも、これらは実際に使い始めてからでは、おいそれと変更できるものではないため、事前にきちんと作りこんでおく必要があります。しかし、それをするためには、自分たちのプロジェクトに起こりえる作業やバグなどの項目を、どのような作業フローで処理していくかを明確に決めておかなければなりません。
作業項目のフォーム定義(<FORM>要素)
作業項目定義に含まれるフォームとは、作業項目のフィールドを画面としてどのような見た目で表示するかを定義するものです。実際にフィールドを画面に表示するための定義方法は次のとおりです。
<Control Type="FieldControl" FiledName="Jp.CodeZine.WIT01.Name" Label="サンプル名" LabelPosition="Left" />
Type
属性は作業項目のフィールドを画面に表示するときに利用するコントロールの種類を設定します。設定可能な種類は図6およびその次の表に示すものが用意されています。
番号 | 種類 | 概要 |
(1) | WorkItemClassificationControl | 区分パスとイテレーションパスのフィールドの場合に利用します。具体的には、フィールドのrefname属性がSystem.AreaPath、System.IterationPathの場合に利用します。画面上にツリー形式でフィールドの値を表示することができます。 |
(2) | HtmlFieldControl | フィールドタイプがPlainText、HTMLの場合に利用します。画面上に複数行形式またはHTML形式でフィールドの値を表示することができます。 |
(3) | WorkItemLogControl | 作業項目の履歴のフィールドの場合に利用します。具体的には、フィールドのrefname属性がSystem.Historyの場合に利用します。画面上に作業項目の履歴情報を表示することができます。 |
(4) | FieldControl | 他のコントロールの利用条件に該当しないフィールドの場合に利用します。大多数のフィールドでは、これを利用することになります。画面上に単項目形式でフィールドの値を表示することができます。 |
(5) | LinksControl | 作業項目に他の作業項目やドキュメントなどへのリンクを持たせたいときに利用します。特定のフィールドには関連付けず、画面上にのみ、リンクの管理情報を表示することができます。 |
(6) | AttachmentsControl | 作業項目に添付ファイルを持たせたいときに利用します。特定のフィールドには関連付けず、画面上にのみ、添付ファイルの管理情報を表示することができます。 |
利用可能なコントロールが何種類かありますが、実際には限られた用途のみに利用するものがいくつかあり、作業項目定義をカスタマイズする場合には、主にHtmlFieldControlとFieldControlの2つを利用していくことになります。見た目の違いだけで言うと、複数行に渡る表示が可能なHtmlFieldControlと1行表示のみのFieldControlということになります。基本的にはこれらを押さえておけば問題ないでしょう。
FieldName
属性は画面に値を表示したり、画面で入力された値を作業項目に保存したりするために利用するフィールドを設定します。ここには、<FIELD>要素内に定義したフィールドから任意のものを設定することができます。ただし、<FIELD>要素のrefname
属性に定義してある文字列と完全に一致するように定義する必要があります。
Label
属性は作業項目定義のフィールドを画面に表示したときにそれを説明するためのラベル名を設定します。一般的に、WindowsフォームアプリケーションやWebアプリケーションなどにあるテキストボックスなどの入力項目の左側につけるラベルと同様のものと考えると分かりやすいのではないでしょうか。
LabelPosition
属性はさきほどのLabel
属性に設定した文字列をコントロールに対してどの位置に表示するかを設定します。設定できる値は、Top、Bottom、Left、Rightの4種類のうちのいずれかで、それぞれ表示されるコントロールの上、下、左、右側のいずれかにラベルを表示させるように設定します。
作業項目のフォーム定義では、フィールドを画面に表示させるための基本的な要素である<Control>要素の他に、WindowsフォームアプリケーションのGroupBoxやTabに該当するグループ化やタブ化をサポートする<Group>や<TabGroup>要素などがサポートされています。他にもレイアウトにかかわる要素がいくつか用意されていますが、詳細についてはMSDNライブラリの『作業項目フォームの<Layout>、<Group>、および<Column>要素』を参照してください。
まとめ
前編となる今回は、作業項目定義を構成する4つのブロック(フィールド定義、状態定義、状態遷移定義、フォーム(レイアウト)定義)について、それぞれがどのように定義されているかを確認してきました。WPF(Windows Presentation Foundation)のXAML(eXtensible Application Markup Language)を理解されているような方にはもしかしたら難なくといったところも多いかもしれませんが、なかなか敷居が高いと感じられたのではないでしょうか。ですが、TFSのようなプロジェクトの管理を目標とするツールを使いこなし、自分たちのプロジェクトにとっての便利な道具にするためには、必要なことになってくるはずです。次回は、今回確認してきた定義の方法をもとに実際に自分たちの作業項目を作り上げていくところに踏み込んでいきます。お楽しみに。