Frage

Ich suche Zeiger, Vorschläge und sogar Diktat, wie Sie für eine .NET-Assembly, die drei verschiedenen Montageversionsnummern zu verwalten. Die Produktversion, ist die einfachste, da dies scheint normalerweise würde von Unternehmen diktiert werden. Dann scheint die Dateiversion für die Versions zwischen Implementierungen zu sein, wo die eigentliche Montage-Version nur dann verwendet wird, wenn Versand.

Im Moment suche ich nur für ein einfaches Mittel zur Markierung von Test- und Wartungsversionen einer Baugruppe, an das keine abhängen, so dass ich bei automatischer Erhöhung Suche Build- und Revisionsnummern auf der Dateiversion und für die endgültige Freigabe, Kopieren der aktuellen Dateiversion auf die Assemblierung-Version. Das Produkt ist in der produktiven Einsatz, aber noch in der Entwicklung - Sie wissen -. Eines dieser kleinen Unternehmen, keine Änderung Steuer Infrastruktur Situationen

War es hilfreich?

Lösung

Versioning ist etwas, dass ich sehr leidenschaftlich bin über und haben eine lange Zeit damit verbracht, mit einem einfach zu kommen Versionierungssystem zu verwenden. Von dem, was Sie bereits in Ihrer Frage gesagt haben, es ist klar, dass Sie einen wichtigen Punkt verstanden haben, sind die Montageversionsnummern nicht mit der Produktversion auch. Man ist technisch getrieben, und die andere von der Wirtschaft angetrieben wird.

Im Folgenden wird angenommen, dass Sie irgendeine Form von Quellcodeverwaltung und einem Build-Server verwenden. Für Kontext verwenden wir Teamcity und Subversion / Git. Teamcity ist frei für eine kleine (10) Anzahl der Projekte und ist ein sehr guter Build-Server, aber es gibt andere, von denen einige sind völlig frei.

Was für eine Versionsnummer bedeutet

Was für eine Version Mittel, um eine Person etwas anderes ein anderes bedeuten kann, die allgemeine Struktur ist Dur, Moll, Makro, Mikro. Die Art, wie ich mit einer Versionsnummer sehen ist sie in zwei Teile zu brechen. Die erste Hälfte beschreibt die Hauptversion (Major) und alle Schlüssel-Updates (Minor). Die zweite Hälfte gibt an, wann es gebaut wurde und was die Quellcode-Version war. Versionsnummern auch bedeuten, verschiedene Dinge je nach dem Zusammenhang ist es eine API, Web App etc.

Major.Minor.Build.Revision

  • Revision Dies ist die Anzahl von Quellensteuer genommen, was zu identifizieren tatsächlich gebaut wurde.
  • Build Dies ist eine ständig steigende Zahl, die verwendet werden können, eine finden insbesondere Build auf dem Build-Server. Es ist eine wichtige Zahl, weil die Build-Server das gleiche gebaut haben kann Quelle zweimal mit einem anderen Satz von Parameter. Mit Hilfe der Build-Nummer in Verbindung mit der Quellennummer Damit können Sie identifizieren, was gebaut wurde und wie.
  • Minor Dies sollte nur geändert werden, wenn es eine signifikante Veränderung zu die öffentliche Schnittstelle. Zum Beispiel, wenn es sich um einen API, würde raubend Code noch sein Lage zu kompilieren? Diese Zahl sollte auf Null zurückgesetzt, wenn die Hauptnummer ändert sein.
  • Major gibt an, welche Version des Produkt sind Sie an. Zum Beispiel des Wichtiger alle Visual Studio 2008 Baugruppen 9 und Visual Studio 2010 10 ist.

Die Ausnahme von der Regel

Es gibt immer Ausnahmen von der Regel, und Sie müssen sich anpassen, wie Sie über sie kommen. Mein ursprünglicher Ansatz basierte Subversion zur Verwendung aber in letzter Zeit habe es Git bewegt. Quellcodeverwaltung wie Subversion und Quelle sicher, dass ein zentrales Repository verwendet eine Nummer, das verwendet werden kann, um einen bestimmten Satz von Quellen aus einem bestimmten Zeitpunkt zu identifizieren. Dies ist nicht der Fall für eine verteilte Quellensteuerung wie Git. Da Git verteilte Repositories verwendet, die es auf jeder Entwicklungsmaschine sind keine Autonummer erhöht wird, die Sie verwenden können, gibt es ein Hack, die die Anzahl der Check-Ins verwendet, aber es ist hässlich. Aus diesem Grund habe ich musste mein Ansatz entwickeln.

Major.Minor.Macro.Build

Die Revisionsnummer ist nun vergangen, siehe, Build verschoben, wo die Revision früher und Makro eingefügt wurde. Sie können das Makro verwenden, wie Sie sehen, passen aber die meiste Zeit ich es in Ruhe lassen. Weil wir Teamcity nutzen die Informationen aus der Revisionsnummer verloren haben, können in der Build gefunden werden, bedeutet es dort ein zweistufiger Prozess ist, aber wir haben nichts verloren und ist ein akzeptabler Kompromiss.

Was setzen

Das erste, was zu verstehen ist, dass die Assembly Version, Dateiversion und Produktversion nicht übereinstimmen müssen. Ich bin nicht dafür, verschiedene Sätze von Zahlen haben, aber es macht das Leben viel einfacher, wenn kleine Änderungen an einer Baugruppe zusammengesetzt ist, die keine öffentlichen Schnittstellen nicht beeinflusst, dass Sie nicht abhängigen Assemblys neu kompilieren sind gezwungen. So wie ich das Geschäft mit dieser ist nur die Haupt- und Nebennummern in der Versammlung V eingestelltersion aber alle die Werte in der Datei Version einzustellen. Zum Beispiel:

  • 1.2.0.0 (Assembly)
  • 1.2.3.4 (Fileversion)

Das gibt Ihnen die Möglichkeit, Hot Fixes ausrollen, die vorhandenen Code nicht brechen wird, weil die Montage Versionen nicht übereinstimmen, aber lassen Sie die Revision / Build von einer Versammlung, um zu sehen, indem die Dateiversionsnummer suchen. Dies ist ein gemeinsamer Ansatz und kann auf einigen Open-Source-Baugruppen zu sehen, wenn man sich die Montagedetails sehen.

Sie als Teamleiter verantwortlich sein müßte die Minor-Nummer für die Erhöhung, wann immer eine Bruchwechsel erforderlich ist. Eine Lösung für Ausrollen eine erforderliche Änderung an eine Schnittstelle, aber nicht vorherigen Code zu brechen ist die aktuellen als veraltet zu markieren und eine neue Schnittstelle zu schaffen. Es bedeutet, dass bestehende Code wird davor gewarnt, dass die Methode ist veraltet und könnte jederzeit entfernt werden, aber Sie nicht alles verlangt sofort zu brechen. Sie können dann die veraltete Methode entfernen, wenn alles migriert wurde.

Wie es verdrahten zusammen

Sie können alles tun, die oben manuell, aber es wäre sehr zeitaufwendig ist, ist die folgende, wie wir den Prozess automatisieren. Jeder Schritt ist runnable.

  • Entfernen Sie die AssemblyVersion und AssemblyFileVersion von allen Attributen des Projekt Assembly CS-Dateien.
  • Erstellen Sie eine gemeinsame Versammlung Info-Datei (nennen wir es VersionInfo.cs) und fügen Sie sie als verknüpfte Element für alle Ihre Projekte.
  • Fügen Sie AssemblyVersion und AssemblyFileVersion Attribute auf die Version mit Werten von "0.0.0.0".
  • Erstellen Sie ein MsBuild Projekt, das Ihre Lösung Datei erstellt.
  • Fügen Sie in einer Aufgabe vor dem Build, die VersionInfo.cs aktualisiert. Es gibt eine Reihe von Open-Source-MsBuild Bibliotheken, die eine Assembly Aufgabe umfassen, die die Versionsnummer festlegen. Nur stellen Sie es auf eine beliebige Anzahl und Test.
  • Fügen Sie eine Eigenschaft Gruppe mit einer Eigenschaft für jedes der Segmente der Build-Nummer enthält. Hier können Sie die Haupt- und Neben gesetzt. Die Build-und Revisionsnummer sollte in als Argumente übergeben werden.

Mit Subversion:

<PropertyGroup>
    <Version-Major>0</Version-Major>
    <Version-Minor>0</Version-Minor>
    <Version-Build Condition=" '$(build_number)' == '' ">0</Version-Build>
    <Version-Build Condition=" '$(build_number)' != '' ">$(build_number)</Version-Build>
    <Version-Revision Condition=" '$(revision_number)' == '' ">0</Version-Revision>
    <Version-Revision Condition=" '$(revision_number)' != '' ">$(revision_number)</Version-Revision>
</PropertyGroup>

Hoffentlich war ich schon klar, aber es gibt eine Menge beteiligt. Bitte alle Fragen. Ich werde jedes Feedback nutze gemeinsam eine prägnante Blog-Post zu bringen.

Andere Tipps

Die [Assembly] ist ein sehr großes Problem in .NET. Eine Philosophie, ermutigt von Microsoft ist, dass Sie lassen es Autoinkrement und zwingt alle Projekte, die auf die Baugruppe hängen neu kompiliert werden. Works okayish wenn Sie einen Build-Server verwenden. Es ist nie die falsch , was zu tun, aber Vorsicht Schwerter der Menschen tragen.

Die andere, enger mit seiner eigentlichen Bedeutung zugeordnet ist, dass die Zahl, die repräsentativ ist für die Versionierung der öffentlichen Schnittstelle der Baugruppe. Mit anderen Worten, können Sie es nur ändern, wenn Sie eine öffentliche Schnittstelle oder Klasse ändern. Da nur eine solche Änderung neu kompiliert Kunden der Versammlung werden muss. Dies muss manuell durchgeführt werden, obwohl, das Build-System automatisch erkennen, eine solche Änderung nicht intelligent genug ist.

Sie können diesen Ansatz weiter verlängern, indem nur Erhöhen der Version, wenn die Baugruppe auf Maschinen außerhalb Ihrer Reichweite eingesetzt wurde. Dies ist der Ansatz, die Microsoft, ihre .NET-Assemblies Versionsnummern nur sehr selten ändern. Vor allem, weil die sehr starken Schmerzen verursacht es auf ihren Kunden.

Also, was Microsoft predigt ist, was es nicht Praktiken. Sein Build-Prozess und Versionskontrolle ist jedoch beispiellos, haben sie sogar einen eigenen Software-Ingenieur, dass überwacht der Prozess. Nicht ganz so gut funktionieren, die WaitHandle.WaitOne (int) Überlastung insbesondere

Sie könnten den Build-Teil der Versionsnummer für Autoinkrement verwenden.

[assembly: AssemblyVersion("1.0.*")]

In Ihrer Umgebung eine Testversion ist eine Version, die eine Build-Version hat! = 0. Bei der Freigabe erhöhen Sie den kleineren Teil und legen Sie den Build-Teil auf 0, das ist, wie Sie freigegeben Baugruppen identifizieren würden.

Wenn Sie Ihre Assemblys im GAC installieren Ihre GAC mit vielen diffent Versionen im Laufe der Zeit überflutet werden, so dass im Auge behalten. Aber wenn Sie die DLLs verwenden nur lokal, ich denke, das ist eine gute Praxis.

Zusätzlich zu Bronumskis Antwort , ich will einen href darauf hin, dass nach dem Semantic Versioning-2.0-Standard bei <=“ http://semver.org“rel =‚nofollow noreferrer‘> semver.org würde Major.Minor.Build.Revision aufgrund der Regel illegal sein, dass eine Reihe nach zunimmt, alle regulären Werte auf der rechten Seite auf Null zurückgesetzt sein müsste .

Eine bessere Möglichkeit, die Standard-Anschluss würde Gebrauch Major.Minor+Build.Revision sein. Dies ist obivously nicht für den Einsatz in AssemblyVersionAttribute, sondern eine benutzerdefinierte Attribut oder statische Klasse könnte stattdessen verwendet werden.

Semver in Teamcity sollte mit dem Meta-Läufer Power Pack zur Verfügung. Für git mit git-Flow (vor allem in der .NET-Welt), fand ich GitVersion hilfreich sein.

Es gibt keine feste Regel, wenn es um die Versionierung Baugruppen kommt, so fühlen sich frei, um zu versuchen, die jemals für Sie arbeiten würde, aber ich würde vorschlagen, dass Sie die Verwendung von 4 Teilen anzunähern, wie Sie die flexiblity haben Incase Sie wollen macht einige Änderungen in der Zukunft.

... für ex. 1.0.0 *

Reserved - Dies fügt zusätzliche Flexibilität, sofern Sie jede Änderung in Zukunft machen wollen. Aber als Standard, halten Sie es als 0.

Bedenken Sie auch die Montage mit starken Schlüssel signieren. Dadurch wird die Montage Konflikt Problem lösen einhüllen Sie mehrere Version der Assembly registriert im GAC haben. MSDN Link-

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top