2012-04-18 11 views
13

zu setzen Ich habe ein Team Foundation Server Build, das sauber ausgeführt wird. Es erzeugt mehrere Assemblies und ich möchte, dass die Assembly-Versionen die letzte Nummer haben, die changset Nummer ist. Das heißt, wenn ich zum Beispiel mit einem changeset11667 festlege, sollte die Assembly-Versionsnummer "x.y.z.11667" sein. Ich habe die verfügbaren Makros überprüft, aber keines ist die Änderungssatznummer.Getting TFS, um das Änderungsset in der Assemblyversion

würde ich immer noch in der Lage sein möge, die Lösung Datei auf meiner dev Maschine normal zu bauen, sondern nur die in Versionsnummer überprüft werden.

Wie würde ich mich über diese an Ort und Stelle zu bekommen?

Antwort

2

Am Ende schrieb ein Kollege von mir die folgende MSBuild Aufgabe, die das Problem löste.

public class GetNextBuildNumber : Task 
{ 
    [Required] 
    public string TfsCommand { get; set; } 

    [Required] 
    public string TfsArgument { get; set; } 

    [Output] 
    public int BuildNumber { get; set; } 

    public override bool Execute() 
    { 
     BuildNumber = GetLatestVersionNumber(); 
     return true; 
    } 

    private int GetLatestVersionNumber() 
    { 
     var process = new RunProcess(); 
     var result = process.ExecuteCommand(TfsCommand, TfsArgument); 

     return ParseResult(result); 
    } 

    private int ParseResult(string result) 
    { 
     const string changeset = "Changeset:"; 
     const string user = "User:"; 

     if (string.IsNullOrEmpty(result) || !result.Contains(changeset)) 
     { 
      // Invalid result 
      Log.LogWarning("Could not get latest build number. Reason: " + result); 
      return 0; 
     } 

     var indexOfChangeset = result.IndexOf(changeset, StringComparison.InvariantCulture) + changeset.Length; 
     var indexOfUser = result.IndexOf(user, StringComparison.InvariantCulture); 
     var revision = result.Substring(indexOfChangeset, indexOfUser - indexOfChangeset).Trim(); 

     return Convert.ToInt32(revision); 
    } 

} 
+0

Wohin mit der benutzerdefinierten Build-Aufgabe - zusammen mit der zu erstellenden Lösung? Wie sieht die zugehörige Build-Definition aus? – mbx

+0

In welchem ​​Namespace befindet sich RunProcess? Ist es kompatibel mit .net 3.5? –

+0

Ich wünschte, ich hätte notiert, wie man diesen Code benutzt, Jungs, ich habe keine Erinnerung mehr daran. – vidstige

3

Werfen Sie einen Blick auf die Community TFS Build Extension project on CodePlex. Es enthält eine AssemblyInfo activity und die TfsVersion activity, die in der Lage sind, die Assembly-Informationen während des Erstellungsprozesses mithilfe eines benutzerdefinierten Formats zu ändern.

Um es auf Ihrer dev Maschine bauen Sie diese Build-Erweiterungen auf Ihren eigenen mit Batch-Dateien und den TFS-Befehlszeilenprogrammen zu implementieren. Verwirklichen

+0

in Ordnung, cool. Also müsste ich irgendeinen speziellen Build machen. Heute zeige ich nur die Lösungsdatei und es funktioniert einfach – vidstige

+0

Sie können die Changeset-Nummer mit der Antwort auf diesen Beitrag erhalten: http://StackOverflow.com/Questions/11748338/TF-Exe-On-TfSpreview/12923581 –

6

, dass diese wird nicht mehr funktionieren, wenn Sie 65.535 Changesets nicht überschreiten. Vielleicht möchten Sie ein anderes Feld aktualisieren. Übrigens, Build Engineering ist Engineering. Auf eine Lösung zu zeigen und zu sagen, dass sie bauen soll, ist nur der Anfang der Reise.

+1

ja, danke für den Tipp. Bei unserer derzeitigen Rate von Check-Ins, die in ungefähr 32 Jahren stattfinden wird, bezweifle ich, dass wir diese Obergrenze erreichen werden. Aus Neugier, was ist die Mütze? Ist es die Assembly-Version, die nur 16 Bit oder ist die Anzahl der Changesets in Quellcodeverwaltung beschränkt? – vidstige

+0

auch, ein wichtiges Prinzip des Motorrings ist es einfach zu halten. Ich möchte in der Lage sein, meine Lösung zu erstellen, indem ich sie einfach auschecke und ohne Skripte ausfühle - der Build-Server sollte dies so genau wie möglich nachahmen, um Probleme auf dem Build-Server zu vermeiden, aber nicht auf meinem Dev-Rechner. Außer ein paar Extras natürlich, die nur auf der Build-Maschine, genau wie die Assembly Versionsnummer. – vidstige

+0

http://msdn.microsoft.com/en-us/library/windows/desktop/aa381058(v=vs.85).aspx –

0

Zu welchem ​​Zweck werden wollte, dass du das tun? Wenn Sie eine Beziehung zwischen einer DLL und dem Quellcode zum Abrufen von TFS haben möchten, besteht der beste Weg darin, die Symbole mithilfe der TFS-Quellcodeverwaltung in der PDB-Generierung zu indizieren. Auf diese Weise erhalten Sie beim Debuggen einer beliebigen Version Ihrer Software bei Bedarf die richtige Version der Quelle von TFS.

+0

Ich habe Absturzberichte mit Bugsense. Ich bekomme nur einen Stacktrace und eine Versionsnummer. Um den StackTrace zu verstehen, muss ich wissen, wie die Quelle zum Zeitpunkt des Builds aussah. – vidstige

+0

Sie können die PDBs nicht mit Ihrer Anwendung versenden? Sieht so aus, als wäre es nicht für Produktionszwecke gedacht (ich nehme an, Sie würden die ausgelieferte Version kennen). – Nock

+0

Schiff PDBs? Klingt nicht nach einer guten Idee. Es wird mit Klick einmal bereitgestellt. Ja, es ist für "Produktion", aber es ist noch nicht veröffentlicht. Und ja, ich würde gerne die ausgelieferte Version wissen. Wir "versenden" täglich zum Test und später werden wir uns wohl auf ein paar Schiffe vor einer stabilen Version absetzen. – vidstige

3

ich auf einem Werkzeug arbeitete den Build-Prozess zu automatisieren es nach wie vor auf der Entwicklung und es ist Open-Source-hier ist der Link (Ich bin ein Release in etwa einer Woche Planung):

https://github.com/jupaol/NCastor

Jetzt ich würde Ihnen empfehlen, die Semantic Versionierung zu überprüfen:

http://semver.org/

um die neueste changeset von TFS zu bekommen, haben Sie mehrere Möglichkeiten:

Ich baute eine benutzerdefinierte Routine diesen

https://github.com/jupaol/NCastor/blob/develop/Solutions/NCastor.AutoBuilder/NCastor.AutoBuilder.Runner/Targets/Build/Versioning/VersionControlServers/TFS/GetTFSRevisionVersion.target

ich diese Routine bauen musste zu tun, weil die Gemeinschaft Aufgaben und die Aufgaben MSBuild Extenssions wurden nicht auf einer 64-Bit-Maschine arbeiten, wenn Sie einen 32-Bit-Computer verwenden zu bauen, dann können Sie die folgenden Aufgaben verwenden:

http://msbuildextensionpack.codeplex.com/

<UsingTask AssemblyFile="$(ExtensionTasksPath)MSBuild.ExtensionPack.dll" TaskName="MSBuild.ExtensionPack.VisualStudio.TfsVersion"/> 

MitVerwendung 0

<UsingTask AssemblyFile="$(MSBuildCommunityTasksLib)" TaskName="MSBuild.Community.Tasks.Tfs.TfsVersion" /> 

Beispiel die verschiedenen Versionen einzustellen:

<UsingTask AssemblyFile="$(MSBuildCommunityTasksLib)" TaskName="MSBuild.Community.Tasks.AssemblyInfo" /> 

<MSBuild.Community.tasks.AssemblyInfo OutputFile="$(AssemblyVersionFilePath)" 
      CodeLanguage="C#" 
      AssemblyFileVersion="$(FileVersion)" 
      AssemblyInformationalVersion="$(InformationalVersion)" 
      AssemblyVersion="$(SemanticVersion)" /> 

Nachdem Sie die Datei erstellt haben einfach diese Datei als Link zu jedem Projekt und voila hinzuzufügen! Alle Ihre Projekte teilen die Informationen zur gemeinsamen Zusammenstellung.

+0

Handelt Ihr Tool irgendwie mit semantischer Versionierung? Haben Sie eine Möglichkeit, den Benutzer zu fragen, ob er die Quelle für eine neue Versionsnummer eincheckt/erstellt/zusammenführt? –

+0

Es verwendet das semantische Versionierungsformat. Vor der Veröffentlichung muss die Version gemäß den semantischen Versionsregeln aktualisiert werden – Jupaol

Verwandte Themen