Wenn Sie meinen Empfehlungen unten folgen (ich habe seit Jahren), können Sie:
- Platzieren Sie jedes Projekt an einer beliebigen Stelle in der Quellcodeverwaltung, solange Sie die Struktur aus dem Projektstammverzeichnis nach unten beibehalten
- Erstellen Sie jedes Projekt überall auf einer beliebigen Maschine mit minimalem Risiko und minimaler Vorbereitung
- Erstellen Sie jedes Projekt vollständig eigenständig, solange Sie Zugriff auf seine binären Abhängigkeiten haben (lokale Verzeichnisse "Bibliothek" und "Ausgabe").
- eine beliebige Kombination von Projekten erstellen und bearbeiten, da diese unabhängig sind
- Erstellen und arbeiten Sie mit mehreren Kopien / Versionen eines einzelnen Projekts, da diese unabhängig sind
- Vermeiden Sie es, Ihr Quellcodeverwaltungs-Repository mit generierten Dateien oder Bibliotheken zu überladen
Ich empfehle (hier ist das Rindfleisch):
Definieren Sie jedes Projekt, um ein einzelnes primäres Ergebnis zu erstellen, z. B. eine DLL, eine EXE-Datei oder eine JAR-Datei (Standard bei Visual Studio).
Strukturieren Sie jedes Projekt als Verzeichnisbaum mit einem einzigen Stamm.
Erstellen Sie für jedes Projekt in seinem Stammverzeichnis ein automatisiertes Erstellungsskript, das es von Grund auf neu erstellt, ohne von einer IDE abhängig zu sein (verhindern Sie jedoch nicht, dass es in der IDE erstellt wird, wenn dies möglich ist).
Erwägen Sie nAnt für .NET-Projekte unter Windows oder ähnliches, basierend auf Ihrem Betriebssystem, Ihrer Zielplattform usw.
Lassen Sie jedes Projekterstellungsskript auf seine externen Abhängigkeiten (von Drittanbietern) von einem einzelnen lokalen gemeinsam genutzten "Bibliotheksverzeichnis" verweisen, wobei jede solche Binärdatei VOLLSTÄNDIG durch die Version identifiziert wird: %DirLibraryRoot%\ComponentA-1.2.3.4.dll
, %DirLibraryRoot%\ComponentB-5.6.7.8.dll
.
Machen Sie jedes Projekt Build - Skript das primäre lieferbare zu einem einzigen lokalen gemeinsamen „output“ Verzeichnis veröffentlichen: %DirOutputRoot%\ProjectA-9.10.11.12.dll
, %DirOutputRoot%\ProjectB-13.14.15.16.exe
.
Lassen Sie jedes Projekterstellungsskript über konfigurierbare und vollständig versionierte absolute Pfade (siehe oben) in den Verzeichnissen "Bibliothek" und "Ausgabe" auf seine Abhängigkeiten verweisen, UND NOCH WO SONST.
Lassen Sie ein Projekt NIEMALS direkt auf ein anderes Projekt oder einen seiner Inhalte verweisen - erlauben Sie nur Verweise auf die primären Ergebnisse im Verzeichnis "Ausgabe" (siehe oben).
Lassen Sie jedes Projekt-Build-Skript über einen konfigurierbaren und vollständig versionierten absoluten Pfad auf die erforderlichen Build-Tools verweisen: %DirToolRoot%\ToolA\1.2.3.4
, %DirToolRoot%\ToolB\5.6.7.8
.
Erstellen Sie für jeden Projekt-Build-Skript-Referenzquellinhalt einen absoluten Pfad relativ zum Projektstammverzeichnis : ${project.base.dir}/src
, ${project.base.dir}/tst
(Syntax variiert je nach Build-Tool).
IMMER ist ein Projekterstellungsskript erforderlich, um JEDE Datei oder jedes Verzeichnis über einen absoluten, konfigurierbaren Pfad zu referenzieren (der in einem Verzeichnis verwurzelt ist, das durch eine konfigurierbare Variable angegeben wird): ${project.base.dir}/some/dirs
oder ${env.Variable}/other/dir
.
Erlauben Sie einem Projekterstellungsskript NIEMALS, auf ALLES mit einem relativen Pfad wie .\some\dirs\here
oder zu verweisen. ..\some\more\dirs
Verwenden Sie IMMER absolute Pfade.
Lassen Sie NIEMALS zu, dass ein Projekterstellungsskript unter Verwendung eines absoluten Pfads, der kein konfigurierbares Stammverzeichnis hat, wie C:\some\dirs\here
oder , auf ALLES verweist \\server\share\more\stuff\there
.
Definieren Sie für jedes konfigurierbare Stammverzeichnis, auf das von einem Projekterstellungsskript verwiesen wird, eine Umgebungsvariable, die für diese Referenzen verwendet wird.
Versuchen Sie, die Anzahl der Umgebungsvariablen zu minimieren, die Sie zum Konfigurieren der einzelnen Computer erstellen müssen.
Erstellen Sie auf jedem Computer ein Shell-Skript, das die erforderlichen Umgebungsvariablen definiert, die für DIESEN Computer spezifisch sind (und möglicherweise für diesen Benutzer, falls relevant).
Stellen Sie das maschinenspezifische Konfigurations-Shell-Skript NICHT in die Quellcodeverwaltung. Legen Sie stattdessen für jedes Projekt eine Kopie des Skripts im Projektstammverzeichnis als Vorlage fest.
ERFORDERN Sie jedes Projekterstellungsskript, um jede seiner Umgebungsvariablen zu überprüfen, und brechen Sie mit einer aussagekräftigen Nachricht ab, wenn sie nicht definiert sind.
ERFORDERN Sie jedes Projekterstellungsskript, um die ausführbaren Dateien des abhängigen Build-Tools, der externen Bibliotheksdateien und der vom Projekt bereitgestellten Dateien zu überprüfen und mit einer aussagekräftigen Meldung abzubrechen, wenn diese Dateien nicht vorhanden sind.
Widerstehen Sie der Versuchung, generierte Dateien in die Quellcodeverwaltung zu übernehmen - keine Projektergebnisse, keine generierte Quelle, keine generierten Dokumente usw.
Wenn Sie eine IDE verwenden, generieren Sie alle Projektsteuerungsdateien, die Sie können, und verpflichten Sie sie nicht zur Quellcodeverwaltung (dies schließt Visual Studio-Projektdateien ein).
Richten Sie einen Server mit einer offiziellen Kopie aller externen Bibliotheken und Tools ein, die auf Entwicklerarbeitsstationen kopiert / installiert und Maschinen erstellt werden sollen. Sichern Sie es zusammen mit Ihrem Quellcodeverwaltungs-Repository.
Richten Sie einen Continuous Integration Server (Build Machine) ohne jegliche Entwicklungstools ein.
Betrachten Sie ein Tool zum Verwalten Ihrer externen Bibliotheken und Liefergegenstände, z. B. Ivy (verwendet mit Ant).
Verwenden Sie Maven NICHT - es wird Sie zunächst glücklich machen und Sie schließlich zum Weinen bringen.
Beachten Sie, dass nichts davon spezifisch für Subversion ist und das meiste davon generisch für Projekte ist, die auf ein Betriebssystem, eine Hardware, eine Plattform, eine Sprache usw. abzielen. Ich habe ein wenig betriebssystem- und werkzeugspezifische Syntax verwendet, aber nur zur Veranschaulichung. -Ich vertraue darauf, dass Sie in Ihr Betriebssystem oder Tool Ihrer Wahl übersetzen.
Zusätzlicher Hinweis zu Visual Studio-Lösungen: Stellen Sie sie nicht in die Quellcodeverwaltung! Bei diesem Ansatz benötigen Sie sie überhaupt nicht oder können sie generieren (genau wie die Visual Studio-Projektdateien). Ich finde es jedoch am besten, die Lösungsdateien einzelnen Entwicklern zu überlassen, um sie nach eigenem Ermessen zu erstellen / zu verwenden (aber nicht in die Quellcodeverwaltung eingecheckt). Ich behalte eine Rob.sln
Datei auf meiner Workstation, von der aus ich auf meine aktuellen Projekte verweise. Da meine Projekte alle eigenständig sind, kann ich Projekte nach Belieben hinzufügen / entfernen (dh keine projektbasierten Abhängigkeitsreferenzen).
Bitte verwenden Sie keine Subversion-Externals (oder ähnliches in anderen Tools), sie sind ein Anti-Pattern und daher nicht erforderlich.
Wenn Sie eine kontinuierliche Integration implementieren oder den Release-Prozess nur automatisieren möchten, erstellen Sie ein Skript dafür. Erstellen Sie ein einzelnes Shell-Skript, das: Parameter des Projektnamens (wie im Repository aufgeführt) und des Tag-Namens verwendet, ein temporäres Verzeichnis in einem konfigurierbaren Stammverzeichnis erstellt und die Quelle auf den angegebenen Projektnamen und Tag-Namen überprüft (indem Sie das erstellen Die entsprechende URL (im Fall von Subversion) zu diesem temporären Verzeichnis führt einen sauberen Build durch, der Tests ausführt und das Ergebnis packt. Dieses Shell-Skript sollte für jedes Projekt funktionieren und im Rahmen Ihres Projekts "Build Tools" in die Quellcodeverwaltung eingecheckt werden. Ihr Continuous Integration Server kann dieses Skript als Grundlage für das Erstellen von Projekten verwenden oder es sogar bereitstellen (aber Sie möchten möglicherweise immer noch Ihr eigenes).
@VonC: Sie möchten NICHT immer mit "ant.jar" anstatt mit "ant-abcdjar" arbeiten, nachdem Sie verbrannt wurden, wenn Ihr Build-Skript kaputt geht, weil Sie es unwissentlich mit einer inkompatiblen Version von Ant ausgeführt haben. Dies ist besonders häufig zwischen Ant 1.6.5 und 1.7.0. Verallgemeinernd möchten Sie IMMER wissen, welche spezifische Version JEDER Komponente verwendet wird, einschließlich Ihrer Plattform (Java ABCD) und Ihres Build-Tools (Ant EFGH). Andernfalls wird es irgendwann zu einem Fehler kommen und Ihr erstes großes Problem besteht darin, herauszufinden, welche Versionen Ihrer verschiedenen Komponenten betroffen sind. Es ist einfach besser, dieses Problem im Voraus zu lösen.