Volle Kontrolle

TFS-Versionskontrolle mit PowerShell
Kommentare

Wer den Team Foundation Server als Plattform für Softwareprojekte nutzt, kennt in der Regel auch die nützlichen Hilfsmittel der TFS Power Tools, wie z. B. den Best Practice Analyzer und die Storyboard Shapes. Gegenstand dieses Artikels sind die in der Werkzeugkiste enthaltenen PowerShell Cmdlets zur Versionskontrolle.

Die Visual Studio Team Foundation Server 2013 Power Tools – erhältlich als frei verfügbarer Download in der Visual Studio Gallery – beinhalten einen Satz von Erweiterungen und Befehlszeilentools zur Unterstützung von Entwicklerteams, die TFS zur Zusammenarbeit und Versionskontrolle nutzen. Relativ wenig Beachtung finden die in den TFS Power Tools enthaltenen PowerShell Cmdlets, die im Umfang einer „Click-Next-Installation“ nicht enthalten sind.

TFS-Versionskontrolle mit PowerShell: Ein erster Blick

Die TFS Cmdlets finden nur über eine benutzerdefinierte Installation der TFS Power Tools den Weg auf den Computer des Entwicklers. Sobald diese kleine Hürde genommen wurde, taucht in der Liste der registrierten PowerShell Snap-ins u. a. ein Snapin namens Microsoft.TeamFoundation.PowerShell auf. Bei diesen Snap-ins handelt es sich um den mit der ersten Version eingeführten Mechanismus zur Erweiterung von PowerShell um Cmdlets und Provider. Mit 2.0 führte Microsoft dann das Konzept der Module ein. Der Snap-in-Mechanismus gilt seitdem zwar als überholt, wird bis dato jedoch weiterhin von jeder PowerShell-Version unterstützt. Nach dem Laden des Microsoft.TeamFoundation.PowerShell Snap-ins listet Get-Command insgesamt 19 TFS Cmdlets auf (Abb. 1), die nun die Arbeit mit TFS-Features wie Changesets, Shelvesets, Workspace etc. in der aktuellen PowerShell-Sitzung erlauben.

Abb. 1: Cmdlets des TFS PowerShell Snap-ins

An dieser Stelle zeigt sich wieder der Vorteil des Verb-Noun-Schemas der Cmdlet-Namen, denn die Funktion eines Cmdlets lässt sich zumindest grob aus seinem Namen ableiten. Wer PowerShell kennt, schätzt das über Get-Help nutzbare Hilfesystem. Meistens findet man hier schnell und aus erster Hand zielführende Informationen. Bezüglich der Hilfetexte waren die Entwickler aber nicht so gewissenhaft wie bei der Benennung der Cmdlets: Leider bietet ein Abruf der detaillierten Hilfe mit Get-Help -Detailed (oder -Full) im Falle der TFS Cmdlets nicht die übliche bzw. zu erwartende Fülle an Informationen, sondern ausschließlich eine Beschreibung der Syntax. Wenigstens ein, zwei Beispiele je Cmdlet hätten ja für’s Erste gereicht. Aktualisierte, über Update-Help abrufbare Hilfetexte stehen genauso wenig zur Verfügung.

„Ich brauche mehr Details“ (D. Hallervorden)

Anlass zur Hoffnung bietet die etwas versteckt außerhalb des „PowerShell-Dunstkreises“ zu findende Hilfedatei C:Program Files (x86)Microsoft Team Foundation Server 2013 Power ToolsHelpPowerShellCmdlets.mht, die eine kurze Dokumentation der TFS Cmdlets enthält. Kenner von TF.exe finden hier bereits alles, was sie brauchen – eine tabellarische Gegenüberstellung von TF.exe-Befehlen und den entsprechenden Cmdlets. Tabelle 1 enthält zugunsten der Übersichtlichkeit nur einen Auszug dieser Informationen. Anmerkung: Die Tabelle enthält auch Alias-Namen. Diese sind verfügbar, wenn die TFS Cmdlets über die Startmenüverknüpfung ProgramsMicrosoft Team Foundation Server 2013 Power ToolsPowerShell Console gestartet werden. Dahinter verbirgt sich ein PowerShell-Skript namens TFSSnapin.ps1.

Tabelle 1: Gegenüberstellung von „TF.exe“ zu TFS Cmdlets und Aliases

TF.exe Verb Noun Alias
add checkout delete undelete Add TfsPendingChange tfpend
undo Remove TfsPendingChange tfundo
status Get TfsPendingChange tfstatus
dir Get TfsChildItem tfdir
checkin New TfsChangeSet tfcheckin
changeset Get Set TfsChangeSet tfchangeset
shelve New TfsShelveSet
shelvesets Get TfsShelveSet tfshelve
unshelve Restore TfsShelveSet tfshelvesets
shelve /delete Remove TfsShelveSet tfunshelve –
get Update TfsWorkSpace tfget
properties Get TfsItemProperty tfproperties
history Get TfsItemHistory tfhistory
Get TfsServer tfserver
Get TfsWorkSpace tfworkspace
Select TfsItem tfselect

Wie es sich für „anständige“ PowerShell Cmdlets gehört, sind die TFS Cmdlets objektorientiert und unterstützen die PowerShell-Pipeline, d. h., es sind Befehlsketten wie beispielsweise folgende möglich:

Add-TfsPendingChange –Add test.txt | New-TfsChangeSet

Eigentlich ist das eine Selbstverständlichkeit – zumal die Cmdlets direkt von Microsoft stammen. Aber in Anbetracht der Negativbeispiele, in denen das PowerShell Snap-in lediglich als Wrapper für textbasierte Konsolentools fungiert (z. B. im Falle der Citrix-Provisioning-Services), gilt den Entwicklern der TFS Cmdlets an dieser Stelle ein Lob. Die unzureichenden Hilfetexte sind damit aber nicht verziehen.

In medias res

In seinem MSDN-Blog stellt Brian Keller, Principal Technical Evangelist bei Microsoft, Hyper-V-basierte ALM-VMs zur Verfügung. Zum Ausprobieren der TFS Cmdlets eignet sich die VM mit dem Namen „Visual Studio 2013 Application Lifecycle Management Virtual Machine and Hands-on-Labs/Demo Scripts“. Die VM enthält:

  • Microsoft Windows Server 2012 Standard Evaluation
  • Microsoft Visual Studio Ultimate 2013
  • Microsoft Visual Studio Team Foundation Server 2013
  • Microsoft Office Professional Plus 2013 (Word, PowerPoint, Excel, Outlook)
  • Microsoft Visio Professional 2013
  • Microsoft Release Management for Visual Studio 2013
  • Microsoft SQL Server 2012 Standard
  • Zu guter Letzt: 24 Hands-on Labs, die sich auch als Demo eignen

Das TFS Cmdlet der ersten Wahl ist Get-TfsServer, weil dessen Ergebnis – die Informationen zur angegebenen TFS-URL, die einen Server oder ein Projekt referenziert – eine unbedingt erforderliche Angabe für nahezu sämtliche TFS Cmdlets ist. Eine beispielhafte Anwendung des Cmdlets Get-TfsServer sieht folgendermaßen aus:

# Abfragen TFS-Information via Server URL
PS C:WDM> $URL = 'http://VSALM:8080/tfs'
PS C:WDM> $myTfs = Get-TfsServer –Name $URL
# Abfragen TFS-Informationen via Project URL
PS C:WDM> $URL = 'http://VSALM:8080/tfs/FabrikamFiberCollection'
PS C:WDM> $myTfsProject = Get-TfsServer –Name $URL

Für und Wider

Eingangs verschwiegen, darf der Offenheit halber nicht unerwähnt bleiben, dass die TFS Cmdlets in der aktuellen Version die Funktionalität von TF.exe nicht vollständig abdecken. Es ist ein guter Anfang. Aber insbesondere vor dem Hintergrund, wenn bereits bestehende und bewährte Lösungen (Batchdateien o. Ä.) portiert werden müssen, wirft dies die berechtigte Frage auf, was denn trotzdem für die Nutzung der Cmdlets spricht und ob sich der ganze Umstellungsaufwand überhaupt lohnt. Pauschal lässt sich das nicht beantworten. Die Trumpfkarte hat PowerShell, sobald es um das Weiterverarbeiten von Informationen geht. Die TFS Cmdlets nutzen, wie in PowerShell üblich, „echte“ Objekte und können sich über die PowerShell-Pipeline sozusagen „die Bälle zuspielen“. Demgegenüber steht TF.exe mit puren Textausgaben, deren Nettoinformationen vor einer Weiterverarbeitung zunächst auf althergebrachte Weise umständlich „freigelegt“ werden müssen. Wenn man mit dem Thema TFS und Versionskontrolle am Anfang steht, sind die TFS Cmdlets zu bevorzugen. Fehlende Funktionalitäten lassen sich ggf. mit TF.exe in PowerShell „verscripten“, wie das Beispiel hier zeigt, das das fehlende Cmdlet Get-TfsPermission nachbaut. Sind jedoch bereits auf TF.exe basierende Skripte im Einsatz und zudem fehlerfrei, heißt die Devise: abwarten. Denn es bedarf keiner Glaskugel, um vorherzusehen, dass die TFS Cmdlets weiterentwickelt werden.

Unsere Redaktion empfiehlt:

Relevante Beiträge

Meinungen zu diesem Beitrag

X
- Gib Deinen Standort ein -
- or -