Schwer gewonnene Erfahrungen haben mich gelehrt, dass fast alles in die Quellcodeverwaltung gehört. (Meine Kommentare hier sind von anderthalb Jahrzehnten Farbe, die für eingebettete / Telekommunikationssysteme auf proprietärer Hardware mit proprietären und manchmal schwer zu findenden Tools entwickelt wurden.)
Einige der Antworten hier lauten "Versetzen Sie keine Binärdateien in die Quellcodeverwaltung". Das ist falsch. Wenn Sie an einem Produkt mit viel Code von Drittanbietern und vielen Binärbibliotheken von Anbietern arbeiten, checken Sie die Binärbibliotheken ein . Andernfalls tritt irgendwann ein Upgrade auf und es treten Probleme auf: Der Build bricht ab, da die Build-Maschine nicht über die neueste Version verfügt. jemand gibt dem Neuen die alten CDs, von denen er sie installieren kann; Das Projekt-Wiki enthält veraltete Anweisungen bezüglich der zu installierenden Version. usw. Schlimmer noch, wenn Sie eng mit dem Anbieter zusammenarbeiten müssen, um ein bestimmtes Problem zu lösen, und dieser Ihnen fünf Bibliotheksgruppen in einer Woche zusendet, müssen Sie dies tunin der Lage sein, zu verfolgen, welche Binärdateien welches Verhalten aufwiesen. Das Quellcodeverwaltungssystem ist ein Tool, das genau dieses Problem löst.
Einige der Antworten hier lauten "Versetzen Sie die Toolchain nicht in die Quellcodeverwaltung". Ich sage nicht, dass es falsch ist, aber es ist am besten, die Toolchain in die Quellcodeverwaltung zu versetzen , es sei denn, Sie verfügen über ein solides Konfigurationsverwaltungssystem . Betrachten Sie erneut das oben erwähnte Upgrade-Problem. Schlimmer noch, ich arbeitete an einem Projekt, bei dem vier verschiedene Varianten der Toolchain im Umlauf waren, als ich eingestellt wurde - alle im aktiven Einsatz ! Eines der ersten Dinge, die ich tat (nachdem ich es geschafft hatte, einen Build zum Laufen zu bringen), war die Versionskontrolle der Toolchain. (Die Idee eines soliden CM-Systems war hoffnungslos.)
Und was passiert, wenn unterschiedliche Projekte unterschiedliche Toolchains erfordern? Ein typisches Beispiel: Nach ein paar Jahren erhielt eines der Projekte ein Upgrade von einem Anbieter und alle Makefiles gingen kaputt. Es stellte sich heraus, dass sie sich auf eine neuere Version von GNU make stützten. Also haben wir alle aufgerüstet. Hoppla, die Makefiles eines anderen Projekts sind alle kaputt gegangen. Lektion: Übernehmen Sie beide Versionen von GNU make und führen Sie die Version aus, die mit Ihrer Projektprüfung geliefert wird.
Oder wenn Sie an einem Ort arbeiten, an dem alles andere außer Kontrolle gerät, führen Sie Gespräche wie: "Hey, der neue Typ fängt heute an, wo ist die CD für den Compiler?" "Keine Ahnung, ich habe sie seit Jacks Rücktritt nicht mehr gesehen, er war der Hüter der CDs." "Äh, war das nicht bevor wir aus dem 2. Stock aufgestiegen sind?" "Vielleicht sind sie in einer Kiste oder so." Und da die Werkzeuge drei Jahre alt sind, gibt es keine Hoffnung, diese alte CD vom Anbieter zu bekommen.
Alle Ihre Build-Skripte gehören in die Quellcodeverwaltung. Alles! Bis hinunter zu Umgebungsvariablen. Ihr Build-Computer sollte in der Lage sein, einen Build eines beliebigen Projekts auszuführen, indem Sie ein einzelnes Skript im Stammverzeichnis des Projekts ausführen. ( ./build
ist ein vernünftiger Standard; ./configure; make
ist fast genauso gut.) Das Skript sollte die Umgebung nach Bedarf einrichten und dann das Tool starten, mit dem das Produkt erstellt wird (make, ant usw.).
Wenn Sie denken, es ist zu viel Arbeit, ist es nicht. Das spart tatsächlich eine Menge Arbeit. Sie übergeben die Dateien einmal zu Beginn und dann bei jedem Upgrade. Kein einzelner Wolf kann seine eigene Maschine upgraden und eine Menge Quellcode schreiben, der von der neuesten Version eines Tools abhängt, wodurch der Build für alle anderen gebrochen wird. Wenn Sie neue Entwickler einstellen, können Sie diese anweisen, das Projekt zu überprüfen und auszuführen ./build
. Wenn in Version 1.8 viele Leistungsoptimierungen vorgenommen wurden und Sie Code, Compiler-Flags und Umgebungsvariablen optimieren, möchten Sie sicherstellen, dass die neuen Compiler-Flags nicht versehentlich auf Patchbuilds der Version 1.7 angewendet werden, da sie den Code wirklich benötigen Änderungen, die mit ihnen einhergehen, oder Sie sehen einige haarige Rennbedingungen.
Und das Beste ist , dass es eines Tages Ihren Hintern rettet: Stellen Sie sich vor, Sie versenden die Version 3.0.2 Ihres Produkts an einem Montag. Hurra, feier. Am Dienstagmorgen ruft ein VIP-Kunde die Support-Hotline an und beschwert sich über diesen überkritischen, dringenden Fehler in Version 2.2.6, den Sie vor 18 Monaten verschickt haben. Und vertraglich müssen Sie es immer noch unterstützen, und sie lehnen ein Upgrade ab, bis Sie mit Sicherheit bestätigen können, dass der Fehler im neuen Code behoben ist, und sie sind groß genug, um Sie zum Tanzen zu bringen. Es gibt zwei parallele Universen:
In einem Universum, in dem es keine Bibliotheken, Toolchain und Build-Skripte in der Quellcodeverwaltung gibt und in dem Sie kein solides CM-System haben ... Sie können die richtige Version des Codes überprüfen, aber es gibt sie Sie alle Arten von Fehlern, wenn Sie versuchen, zu bauen. Mal sehen, haben wir die Tools im Mai aktualisiert? Nein, das waren die Bibliotheken. Ok, gehe zurück zu den alten Bibliotheken - warte, gab es zwei Upgrades? Ah ja, das sieht ein bisschen besser aus. Aber jetzt kommt mir dieser seltsame Linker-Absturz bekannt vor. Oh, das liegt daran, dass die alten Bibliotheken nicht mit der neuen Toolchain zusammengearbeitet haben. Deshalb mussten wir ein Upgrade durchführen, oder? (Ich erspare Ihnen die Qual des restlichen Aufwands. Es dauert zwei Wochen, und am Ende ist niemand glücklich, nicht Sie, nicht das Management, nicht der Kunde.)
In dem Universum, in dem sich alles in der Quellcodeverwaltung befindet, checken Sie das 2.2.6-Tag aus, haben ein Debug-Build in etwa einer Stunde fertig, verbringen einen oder zwei Tage damit, den "VIP-Bug" neu zu erstellen, die Ursache aufzuspüren und zu beheben die aktuelle Version, und überzeugen Sie den Kunden, zu aktualisieren. Stressig, aber nicht annähernd so schlimm wie das andere Universum, in dem Ihr Haaransatz 3 cm höher ist.
Wenn das gesagt ist, können Sie es zu weit bringen:
- Sie sollten ein Standard-Betriebssystem installieren, von dem Sie eine "goldene Kopie" haben. Dokumentieren Sie es, wahrscheinlich in einer README-Datei, die sich in der Quellcodeverwaltung befindet, damit zukünftige Generationen wissen, dass Version 2.2.6 und früher nur auf RHEL 5.3 und 2.3.0 und später nur auf Ubuntu 11.04 basiert. Wenn es für Sie einfacher ist, die Toolchain auf diese Weise zu verwalten, wählen Sie es aus und vergewissern Sie sich, dass es sich um ein zuverlässiges System handelt.
- Die Pflege der Projektdokumentation in einem Versionsverwaltungssystem ist umständlich. Projektdokumente sind immer dem Code selbst voraus und es ist nicht ungewöhnlich, an der Dokumentation für die nächste Version zu arbeiten, während Sie an Code für die aktuelle Version arbeiten. Insbesondere, wenn alle Ihre Projektdokumente Binärdokumente sind, die Sie nicht unterscheiden oder zusammenführen können.
- Wenn Sie ein System haben, das die Versionen aller im Build verwendeten Komponenten steuert, verwenden Sie es ! Stellen Sie einfach sicher, dass die Synchronisierung im gesamten Team einfach ist, sodass alle (einschließlich der Build-Maschine) von denselben Tools profitieren. (Ich denke an Systeme wie Debians Pbuilder und den verantwortungsvollen Umgang mit Pythons Virtualenv.)