FAQ: Wie pflege ich eigene Änderungen beim Update des Quellcodes ein? | Archilles | Dienstag, 24.05.2005 12:05:32 |
Version 1 - 24. Mai 2005 12:05:00 CEST Hallo zusammen, welcher Webmaster kennt es nicht? Er nutzt eine Software von Drittanbietern und hat sie an seine Bedürfnisse angepasst. Wenn ein Programm im Quellcode vorliegt und die Lizenz es erlaubt, ist das nicht selten. Eine der unbeliebtesten Hürden stellt sich ein, wenn es ein Update gibt und dieses eingepflegt werden muß. Kopiert man nun einfach alle Dateien, sind die eigenen Änderungen weg und erneut nachzutragen. Je nach Umfang der Aktualisierungen, deren Dokumentation und Häufigkeit, wird dieses Unterfangen ab einem bestimmten Punkt zu aufwendig. Etwas leichter hat man es, wenn möglichst viele Einstellungen in Dateien lagern, welche davon nicht betroffen sind. Mit ein paar kleinen Programmen kann man dem beikommen und sich helfen lassen. Ziel ist es die Änderungen zu erfassen und in die neue Version einzuspielen. Dabei gibt es zwei offensichtliche Wege. Beim ersten dokumentiert man die Änderungen, welche man gegen das Original gemacht hat und überträgt diese auf die neue Version. Zum anderen kann man auch auf die Änderungen der neuen Version gegenüber der aktuellen setzen. Welcher Weg von beiden funktioniert, hängt von Fall zu Fall ab. Ich verwende meistens den zweiten Weg. Für dieses How-To wird folgendes benötigt:
Es empfiehlt sich mit Kopien der Quellen in einem eigenen Verzeichnis zu arbeiten! Es geht los... Ich habe hier als Beispiel den Ordner p:\ramdisk genommen. Es soll das TBF von Version 2.0.1 auf 2.0.2 aktualisiert werden. Da es diese beim Erstellen dieses Dokuments noch nicht gab, kommt ein Auszug der aktuellesten Quellen zum Zuge. Vom Ursprungsforum habe ich die oben gelisteten Dateien in das Verzeichnis p:\ramdisk\src-tbf_201 kopiert. Der Verzeichnisbaum sieht dann folgendermaßen aus: Quelltext: ============================================================ --\ramdisk --\src-tbf_201 --\contrib --\include --\cron --\template --\tbfV2 --\usr --\lang Im Verzeichnis p:\ramdisk\src-tbf_dev landen die aktuellen Gegenstücke. WinMerge bekommt einen Platz im Programme-Ordner und die beiden anderen in p:\ramdisk. Wer sie dauerhaft nutzen möchte, kann sie in den Windows-Hauptordner kopieren. Wir starten WinMerge und gehen auf "Öffnen". Es erscheint ein Fenster, wo wir beide Verzeichnisse angeben müssen. Unter "Links" sollte der Ordner mit dem alten Code stehen und "Rechts" der neue. Als Filter genügt "*.*". Das Erstellen des Vergleichs dauert ein paar Sekunden. Dabei erscheint ein kleines Fenster, welches über den Status informiert und danach von Hand geschlossen werden muß. Es öffnet sich bei jedem Verzeichniswechsel oder manueller Aktualisierung. Wen das nervt, kann das in den Einstellungen des Programms auch abschalten. Dann schließt sich das Fenster automatisch. In dieser Übersicht sehen wir den Vergleich. Mittels Rechtsklick auf einer Datei öffnet sich ein Kontextmenü mit den Funktionen. Wenn eine neue Datei nur in einem Verzeichnis existiert, kann sie hier kopiert werden. Ebenso kann eine alte, jetzt unbenötigte, Datei gelöscht werden. Ein Doppelklick auf eine Datei öffnet ein Editorfenster für den manuellen Abgleich. Das mag bei wenigen Dateien machbar sein, bei größeren Updates wird es jedoch schnell nervig. Hier verwenden wir daher WinMerge nur zum Vergleichen beider Quellen. Wer es dennoch von Hand machen möchte, sollte von Stelle zu Stelle gehen und kurz vergleichen. Ein Block kann man doppeltklicken, um ihn auszuwählen und dann per Rechtsklick "nach Rechts zu kopieren". Das erfordert bei Konflikten jedoch Kenntnisse, um die Funktionen im Quellcode. Daher empfehle ich das nur erfahrenen Anwendern. Jetzt geht es daran die Änderungen zu dokumentieren. Dafür ziehen wir das Programm diff heran. Es vergleicht alle Dateien beider Verzeichnisse und speichert die Unterschiede in einer separaten Datei. Dies wird in der Softwarewelt häufig gemacht - auch gerade wenn es um Patches geht. Dafür benötigen wir die MS-DOS Eingabeaufforderung. Sie befindet sich im Startmenü unter "Zubehör". Als erstes wechseln wir auf das Laufwerk, wo wir die Dateien plaziert haben und dann in das eigentliche Verzeichnis. Linux-Benutzer machen das analog auf einer Shell oder einer Konsole (Strg+Alt+F1 bis F6). Hier gilt es natürlich die unterschiedlichen Pfade zu beachten, welche beide Welten unterscheidet :-) Im folgenden Bild steht der Befehl für das Erstellen eines "Diff-File". Je nach Geschwindigkeit des Rechners, kann dies ein paar Sekunden dauern. Dahinter wird auch gleich der Befehl für patch eingegeben, um die Änderungen von neu gegen alt im alten Quellcode einzuspielen. Wer den erstmal durchspielen möchte, sollte die Option "--dry-run" hinter "patch.exe" eingeben. Bei Problemen wird sich das Programm schon melden. Die Konflikte sind dann später in WinMerge von Hand aufzulösen. Generelle Hilfe zu beiden Programmen gibt es mit "diff.exe --help" respektive "patch.exe --help". Seitenansicht erhält man, wenn man ein " | more" anhängt ("patch.exe --help | more"). Das zweite Bild zeigt wie ein solches Diff-File aufgebaut ist und zur besseren Darstellung hebt Notepad2 das wichtigste hervor. Ich denke das ist weitesgehend selbsterklärend. Rote Blöcke werden durch die grünen ausgetauscht. Während des Patchdurchlaufes sieht man dieses: Sofern keine Fehler aufgetreten sind, sollten jetzt alle Änderungen eingespielt sein. Mit WinMerge können wir das überprüfen. Alle Dateien sollten nun als "identisch" deklariert werden. Tun sie das nicht, mag das an unterschiedlichem Zeilenumbruch liegen. Dann werden die Dateien beim Vergleich mit Doppelklick als roter Block angezeigt, obwohl der Text identisch ist. In den Optionen des Programms kann man die unterschiedlichen Zeilenumbrüche ignorieren. Nach eine Aktualisierung mit F5 sollten die Dateien schlußendlich "identisch" sein. Vorgefertigte Patchdateien sind beim sf.net-Server zu finden. Sie enthalten die Änderungen seit der jeweils letzten Version im Unified-Format. Fragen, Anmerkungen und Fehler bitte per E-Mail, PN oder in einem gesonderten Beitrag! Wie immer ;-) |