Laden...

AnkhSVN Revision Nummer in Build einbeziehen

Erstellt von pdelvo vor 12 Jahren Letzter Beitrag vor 12 Jahren 3.276 Views
pdelvo Themenstarter:in
1.346 Beiträge seit 2008
vor 12 Jahren
AnkhSVN Revision Nummer in Build einbeziehen

Hallo!

Ich benutze aktuell AnkhSVN, um einen SVN Support für mein Visual Studio 2010 Professional zu bekommen. Nun brauche ich das aktuell für eine Software, von der ich regelmäßig einen Build auf den Server ziehe, wo das programm dann drauf läuft. Nun möchte ich wissen, zu welcher Revision die Version gehört, also die aktuelle Revision Nummer in die Datei & Assembly Version mit einbeziehen. Ich habe da schon etwas länger gesucht, aber noch nichts gefunden. Es geht mir hierbei um die SVN Revision Nummer, also einfach einen * benutzen funktioniert nicht.

Lieben Gruß

pdelvo

B
387 Beiträge seit 2005
vor 12 Jahren

Hi,

direkt über AnkhSVN wirds wohl nicht gehen. Ich würde eher versuchen, eventuell durch ein WebService Aufruf auf den SVN-Server oder ein Kommandozeilentool, die aktuelle Revisionsnummer rauszufinden und über ein Script ins eigene Coding einzubauen. Eventuell sogar im Postbuild-Ereignis.

Falls du eine Lösung in die Richtung findest, könntest du diese hier bitte Posten. Wär eigentlich keine schlechte Idee, sowas auch bei unseren SVN-Projekten mit einzubauen.

edit: Oder schau dir mal den svn Kommandozeilen-Client an. In Kapitel 9. Die komplette Subversion Referenz: svnlook gibt es zum Beispiel ein Befehl, mit dem du vielleicht an die Revisionsnummer kommst (jetzt nicht getestet).

Gruß
Roland

pdelvo Themenstarter:in
1.346 Beiträge seit 2008
vor 12 Jahren

Ich hab mir gerade was gebastelt, eher quick & dirty, aber es funktioniert und reicht für mich erst mal. Das ganze aktualisiert jeweils nur die Assembly Version. Ich habe es nicht hinbekommen, die Dateiversion auch zu aktualisieren. Gebraucht wird das ILMerge Tool, sowie die SharpSVN Bibliothek.

    class Program
    {
        static void Main(string[] args)
        {
            string assembly = args[0];
            string repoPath = args[1];
            string ilmerge = @"%PROGRAMFILES(X86)%\Microsoft\ILMerge\ILMerge.exe";
            ilmerge = Environment.ExpandEnvironmentVariables(ilmerge);

            Version version = GetAssemblyVersion(assembly);

            using (SvnClient client = new SvnClient())
            {
                SvnInfoEventArgs info;
                Uri repos = new Uri(repoPath);
                client.GetInfo(repos, out info);
                version = new Version(version.Major, version.Minor, version.Build, (int)info.Revision);
            }
            string param = "";
            if (File.Exists(assembly + "_old.exe"))
                File.Delete(assembly + "_old.exe");
            File.Move(assembly, assembly + "_old.exe");
            Process p = Process.Start(ilmerge, param = string.Format("/ver:{0} /out:{1} {2}", version, assembly, assembly + "_old.exe"));
            p.WaitForExit();
            File.Delete(assembly + "_old.exe");
        }

        private static Version GetAssemblyVersion(string assembly)
        {
            Assembly asm = Assembly.Load(File.ReadAllBytes(assembly));
            return asm.GetName().Version;
        }
    }

Dann als Postbuildereignis

"H:\Pfad\zum\Tool.exe" $(TargetPath) "https://schlag-mich-tod/svn/wasweissich/"

Wie gesagt eine Fehlerbehandlung fehlt, aber da hab ich aktuell keine Lust zu. Wer es benutzen will kann das ja noch einbauen. Wenn trotzdem jemand etwas eleganteres kennt, würde ich mich über weitere Antworten freuen! 😃

656 Beiträge seit 2008
vor 12 Jahren

Wir benutzen CruiseControl.net als Werkzeug für Continuous Integration, und da bekommt man in seinen Plugins auch Informationen über den aktuellen SCM Stand - mit ein bisschen Plugin Coding (gibts genug Beispiele) läuft bei uns ein Modifier drüber, der nach dem Update (und vor dem Build) alle AssemblyInfo.cs durchläuft und als AssemblyFileVersion die Standard AssemblyVersion plus die Revisionsnummer als letzte Stelle einträgt.

Für kleine Projekte, die nicht über CCNet laufen habe ich mir seinerzeit ein T4 Template geschrieben, was mir einfach die AssemblyInfo.cs aus den SVN Sandboxes generiert - funktioniert aber nicht mit Subversion 1.7 (wo sich die Sandboxes geändert haben), und alles unter 1.6 habe ich nicht getestet. Erfordert auch vorher ein Update, damit die Sandbox aktuell ist, aber ich denke dass das kein Problem darstellen sollte.

Selbst wenn dir beides nicht direkt was bringt, könnte es zumindest als Inspiration für was eigenes herhalten.

2.891 Beiträge seit 2004
vor 12 Jahren

TeamCity hat auch einen AssemblyVersionPatcher.

Ansonsten einfach mal in [FAQ] Automatisches Vergeben der Revisions- und Buildnummer gucken. Das ist doch direkt das Problem - die Aufnahme der SVN-Revisionsnummer in die AssemblyVersion.

pdelvo Themenstarter:in
1.346 Beiträge seit 2008
vor 12 Jahren

Hab es jetzt wie in der FAQ gelöst, auch wenn mir das ändern der AssemblyInfo Datei nicht gefällt, da die dann immer als Update auf dem Server landet 😕

M
120 Beiträge seit 2009
vor 12 Jahren

Irgendwie klingt das aus der FAQ recht umständlich. Man kann ja über Platzhalterbefehle die aktuelle SVN-Version in die Datei schreiben lassen, man muss nur dann dafür sorgen, dass man den Platzhalterbefehl beim Ausgeben wieder entfernt und beim Prebuildprozess in die Codedatei z.B. das aktuelle Datum und Uhrzeit reinschreibt (damit die geändert ist und die SVN-Version aktualisiert wird; dabei könnte man dann auch die AssemblyVersion ohne den Platzhalterbefehl setzen).