Team Foundation Server liefert Tasks, welche MSBuild erweitern
wie z.B. der GenCheckinNotesUpdateWorkItems Task.

Der GenCheckinNotesUpdateWorkItems Task assoziiert auf Basis von
Version Control Labels, Changesets und Workitems,
welche dann im Build Report angezeigt werden. 

Wird ein Build durchgeführt, wird ein Label gespeichert z.B. Label1.
Ein Zweiter Build erstellt wiederum ein Label, Label2.
Der GenCheckinNotesUpdateWorkItems sucht dann nach
Changesets, deren Checkin zwischen Label1 und Label2
durchgeführt wurde, die er dann auch im Report
ausgibt.

Die so gefundenen Changesets werden auf assoziierte
Workitems untersucht und diese entsprechend im Report
angezeigt.

Soweit so gut... Schauen wir uns folgendes Szenario an:

Unser TeamProject hat 2 Solutions:
TeamProject\BizLogic und TeamProject\Client.

Es gibt ein Build, der beide Solutions "buildet".
Ein zweiter Build, der nur die Solution BizLogic "buildet".

Nun ist die Anforderung, dass der Build BizLogic nur
Changesets assoziiert, die im Scope der Solution
BizLogic durchgeführt worden sind. 

Hört sich eigenlich ganz einfach an, ist es aber nicht,
da im Default die Labels immer auf TeamProject Ebene gesetzt
werden. Was dazu führt, dass auch ein Checkin in der
Solution Client durch den Label Diff im Report 
angezeigt werden wird.  

Wie lösen? Durch die Definition eines Scopes
mit einem neuen Label, welches nur auf dem Bereich
der  Solution BizLogic gesetzt wird.

Hierzu erweitert man das Build .proj File der Solution BizLogic.
In einer PropertyGroup definiert man <GetChangesetForFolder>,
welches in unserem Fall die BizLogic ist. 
<LabelQueryScope> wird um diese Information erweitert,
da der GenCheckinNotesUpdateWorkItems Task diese
für die Abfrage verwendet.

Dann das Target CoreLabel überschreiben, um das Label
in dem Scope der Solution BizLogic zu setzen.

<PropertyGroup>

 <GetChangesetForFolder>BizLogic
      </GetChangesetForFolder>

 <LabelQueryScope>@$/$(TeamProject)/$(GetChangesetForFolder)
     
</LabelQueryScope>

</PropertyGroup>

 

 

<Target Name="CoreLabel"

   Condition=" '$(IsDesktopBuild)'!='true' "

   DependsOnTargets="$(CoreLabelDependsOn)" >

   

 <Label

  Condition=" '$(SkipLabel)'!='true' "

  Workspace="$(WorkspaceName)"

  Name="$(BuildNumber)@$/$(TeamProject)/$(GetChangesetForFolder)"

  Version="W$(WorkspaceName)"

  Files="$/$(TeamProject)/$(GetChangesetForFolder)"

  Recursive="true" />

</Target>

Das wars :-) Ein Build von Bizlogic wird nun im Report nur Changesets
auflisten, die auch in diesem Scope durchgeführt wurden.

Noch ein Hinweis, der GenCheckinNotesUpdateWorkItems Task
ist extrem Performance intensiv, mehr Infos hierzu findet
Ihr hier.

Chris