Angenommen, Sie haben eine typische Web-App und eine Dateikonfiguration. Jeder Entwickler, der an dem Projekt arbeitet, hat eine Version für seine Entwicklungsboxen, es gibt eine Entwicklungs-, Produkt- und Bühnenversion. Wie gehen Sie in der Quellcodeverwaltung damit um? Diese Datei überhaupt nicht einchecken, mit anderen Namen prüfen oder etwas Besonderes tun?
quelle
Versioniere diese Datei nicht. Version einer Vorlage oder so.
quelle
Mein Team führt für jede Umgebung separate Versionen der Konfigurationsdateien (web.config.dev, web.config.test, web.config.prod). Unsere Bereitstellungsskripte kopieren die richtige Version und benennen sie in web.config um. Auf diese Weise haben wir die volle Versionskontrolle der Konfigurationsdateien für jede Umgebung, können problemlos einen Diff durchführen usw.
quelle
Derzeit habe ich die Konfigurationsdatei "Vorlage" mit einer hinzugefügten Erweiterung, zum Beispiel:
Ich kann jedoch ein Problem mit dieser Methode feststellen, wenn sich kritische Änderungen geändert haben.
quelle
+1 auf dem Vorlagenansatz.
Da diese Frage jedoch mit dem Tag Git versehen ist, fällt mir die verteilte Alternative ein, bei der Anpassungen in einem privaten Testzweig vorgenommen werden:
In diesem Schema enthält die Hauptzeile eine generische "Vorlagen" -Konfigurationsdatei, für deren Funktion nur minimale Anpassungen erforderlich sind.
Jetzt können Entwickler / Tester die Konfigurationsdatei nach Herzenslust anpassen und diese Änderungen nur lokal in einem privaten Testzweig festschreiben (z. B. B '= B + Anpassungen). Jedes Mal, wenn die Hauptlinie voranschreitet, wird sie mühelos zu Tests zusammengeführt, was zu Zusammenführungs-Commits wie D 'führt (= D + zusammengeführte Version der Anpassungen von B).
Dieses Schema leuchtet wirklich, wenn die Konfigurationsdatei "Vorlage" aktualisiert wird: Die Änderungen von beiden Seiten werden zusammengeführt und führen höchstwahrscheinlich zu Konflikten (oder Testfehlern), wenn sie nicht kompatibel sind!
quelle
Die Lösung, die wir verwenden, besteht darin, nur die einzige Konfigurationsdatei (web.config / app.config) zu haben. Wir fügen der Datei jedoch einen speziellen Abschnitt hinzu, der Einstellungen für alle Umgebungen enthält.
Es gibt einen Abschnitt LOCAL, DEV, QA, PRODUCTION , der jeweils die für diese Umgebung relevanten Konfigurationsschlüssel in unseren Konfigurationsdateien enthält.
Damit dies alles funktioniert, ist eine Assembly mit dem Namen xxx.Environment, auf die in allen unseren Anwendungen (Winforms und Webforms) verwiesen wird, die der Anwendung mitteilt, in welcher Umgebung sie ausgeführt wird.
Die xxx.Environment-Assembly liest eine einzelne Informationszeile aus der machine.config des angegebenen Computers, die angibt , dass sie sich auf DEV, QA usw. befindet. Dieser Eintrag ist auf allen unseren Workstations und Servern vorhanden.
Hoffe das hilft.
quelle
Ich habe immer alle Versionen der Konfigurationsdateien in der Quellcodeverwaltung im selben Ordner wie die Datei web.config gespeichert.
Beispielsweise
Ich bevorzuge diese Namenskonvention (im Gegensatz zu web.config.production oder Production.web.config), weil
Die Standardkonfigurationsdatei sollte so konfiguriert sein, dass Sie die Anwendung lokal auf Ihrem eigenen Computer ausführen können.
Am wichtigsten ist, dass diese Dateien in jeder Hinsicht nahezu 100% identisch sind, auch bei der Formatierung. Sie sollten in einer Version keine Tabulatoren und in einer anderen keine Leerzeichen zum Einrücken verwenden. Sie sollten in der Lage sein, ein Diff-Tool für die Dateien auszuführen, um genau zu sehen, was zwischen ihnen unterschiedlich ist. Ich bevorzuge WinMerge, um die Dateien zu unterscheiden.
Wenn Ihr Erstellungsprozess die Binärdateien erstellt, sollte es eine Aufgabe geben, die die web.config mit der für diese Umgebung geeigneten Konfigurationsdatei überschreibt. Wenn die Dateien komprimiert sind, sollten die nicht relevanten Dateien aus diesem Build gelöscht werden.
quelle
Ich habe die Vorlage bereits verwendet, dh web.dev.config, web.prod.config usw., bevorzuge jetzt jedoch die Technik zum Überschreiben von Dateien. Die Datei web.config enthält die meisten Einstellungen, eine externe Datei enthält jedoch umgebungsspezifische Werte, z. B. Datenbankverbindungen. Gute Erklärung auf Paul Wilsons Blog .
Ich denke, dies reduziert die Menge an Duplikaten zwischen den Konfigurationsdateien, die beim Hinzufügen neuer Werte / Attribute Schmerzen verursachen können.
quelle
@Grant ist richtig.
Ich bin in einem Team mit fast 100 anderen Entwicklern und unsere Konfigurationsdateien werden nicht in die Quellcodeverwaltung eingecheckt. Wir haben Versionen der Dateien im Repository, die bei jedem Auschecken abgerufen werden, sich aber nicht ändern.
Für uns hat es ganz gut geklappt.
quelle
Ich kontrolliere die Version, aber schiebe sie niemals auf die anderen Server. Wenn der Produktionsserver eine Änderung erfordert, nehme ich diese Änderung direkt an der Konfigurationsdatei vor.
Es mag nicht schön sein, aber es funktioniert gut.
quelle
Die eingecheckte Plain-Vanilla-Version von app / web.config sollte generisch genug sein, um auf allen Entwicklercomputern zu funktionieren, und über neue Einstellungsänderungen usw. auf dem Laufenden gehalten werden. Wenn Sie bestimmte Einstellungen für dev benötigen / test / Production-Einstellungen, checken Sie separate Dateien mit diesen Einstellungen ein, wie GateKiller angegeben hat, mit einer Art Namenskonvention, obwohl ich normalerweise mit "web.prod.config" gehe, um die Dateierweiterung nicht zu ändern.
quelle
Wir verwenden eine Vorlagenkonfigurationsdatei, die zur Versionskontrolle eingecheckt wird, und dann einen Schritt in unserem automatisierten Build, um bestimmte Einträge in der Vorlagendatei durch umgebungsspezifische Einstellungen zu ersetzen. Die umgebungsspezifischen Einstellungen werden in einer separaten XML-Datei gespeichert, die ebenfalls der Versionskontrolle unterliegt.
Wir verwenden MSBuild in unserem automatisierten Build, daher verwenden wir die XmlUpdate-Aufgabe von MSBuild Community Tasks , um die Werte zu aktualisieren.
quelle
Ich habe lange Zeit genau das getan, was bcwood getan hat. Ich halte Kopien von web.dev.config, web.test.config, web.prod.config usw. unter Quellcodeverwaltung und benenne sie dann automatisch um, wenn es in verschiedenen Umgebungen bereitgestellt wird. Sie erhalten eine gewisse Redundanz zwischen den Dateien (insbesondere mit all den asp.net-Inhalten), aber im Allgemeinen funktioniert es sehr gut. Sie müssen auch sicherstellen, dass sich alle Mitglieder des Teams daran erinnern, alle Dateien zu aktualisieren , wenn sie Änderungen vornehmen.
Übrigens möchte ich ".config" am Ende als Erweiterung behalten, damit die Dateizuordnungen nicht unterbrochen werden.
In Bezug auf lokale Entwicklerversionen der Konfigurationsdatei versuche ich immer mein Bestes, um die Benutzer zu ermutigen, dieselben lokalen Einstellungen so weit wie möglich zu verwenden, sodass keine eigene Version erforderlich ist. Es funktioniert nicht immer für alle. In diesem Fall ersetzen die Leute es normalerweise nur vor Ort vor Ort und gehen von dort aus. Es ist nicht zu schmerzhaft oder so.
quelle
In unserem Projekt haben wir die Konfiguration in Dateien mit einem Präfix gespeichert, dann zieht unser Build-System die entsprechende Konfiguration basierend auf dem Hostnamen des aktuellen Systems. Dies funktioniert gut für uns in einem relativ kleinen Team, sodass wir Konfigurationsänderungen auf die Dateien anderer Personen anwenden können, wenn wir ein neues Konfigurationselement hinzufügen. Offensichtlich lässt sich dies definitiv nicht auf Open Source-Projekte mit einer unbegrenzten Anzahl von Entwicklern skalieren.
quelle
Wir haben hier zwei Probleme.
Zunächst müssen wir die Konfigurationsdatei steuern, die mit der Software geliefert wird.
Für Entwickler ist es einfach, eine unerwünschte Änderung an der Master-Konfigurationsdatei einzuchecken, wenn sie dieselbe Datei in der Entwicklungsumgebung verwenden.
Wenn Sie andererseits eine separate Konfigurationsdatei haben, die vom Installationsprogramm bereitgestellt wird, können Sie leicht vergessen, eine neue Einstellung hinzuzufügen oder die darin enthaltenen Kommentare nicht mehr mit den Kommentaren in der Entwicklung synchronisieren zu lassen Datei konfigurieren.
Dann haben wir das Problem, dass Entwickler ihre Kopie der Konfigurationsdatei auf dem neuesten Stand halten müssen, wenn andere Entwickler neue Konfigurationseinstellungen hinzufügen. Einige Einstellungen wie Datenbankverbindungszeichenfolgen sind jedoch für jeden Entwickler unterschiedlich.
Es gibt ein drittes Problem, das die Frage / Antwort nicht abdeckt. Wie können Sie die Änderungen, die ein Kunde an Ihrer Konfigurationsdatei vorgenommen hat, zusammenführen, wenn Sie eine neue Version Ihrer Software installieren?
Reduzieren Sie zunächst die Anzahl der Konfigurationselemente in Ihrer Hauptkonfigurationsdatei.
Wenn Sie nicht zulassen müssen, dass Ihre Kunden Ihre Zuordnungen ändern, verwenden Sie Fluent NHibernate (oder auf andere Weise), um die Konfiguration in Code zu verschieben.
Ebenso für die Einrichtung der Abhängigkeitsinjektion.
Teilen Sie die Konfigurationsdatei nach Möglichkeit auf, z. B. verwenden Sie eine separate Datei, um die Log4Net-Protokolle zu konfigurieren.
Wiederholen Sie keine Elemente zwischen vielen Konfigurationsdateien. Wenn Sie beispielsweise 4 Webanwendungen auf demselben Computer installiert haben, verfügen Sie über eine Gesamtkonfigurationsdatei, auf die die Datei web.config in jeder Anwendung verweist.
(Verwenden Sie standardmäßig einen relativen Pfad, daher muss die Datei web.config nur selten geändert werden.)
Verarbeiten Sie die Entwicklungskonfigurationsdatei, um die Versandkonfigurationsdatei zu erhalten.
Dies kann durch Standardwerte in den XML-Kommentaren erfolgen, die dann in der Konfigurationsdatei festgelegt werden, wenn ein Build abgeschlossen ist. Oder Abschnitte haben, die im Rahmen der Erstellung des Installationsprogramms gelöscht werden.
Anstatt nur eine Datenbankverbindungszeichenfolge zu haben, sollten Sie eine pro Entwickler verwenden.
Suchen Sie beispielsweise zuerst zur Laufzeit in der Konfigurationsdatei nach "database_ianr" (wobei ianr mein Benutzername oder Computername ist). Wenn es nicht gefunden wird, suchen Sie nach "database".
Mit einem zweiten Level "zB -oracle oder -sqlserver" können Entwickler schneller auf beide Datenbanksysteme zugreifen.
Dies kann natürlich auch für jeden anderen Konfigurationswert erfolgen.
Dann können alle Werte, die mit "_userName" enden, vor dem Versand der Konfigurationsdatei entfernt werden.
Sie können die Notwendigkeit einer fürsorglichen Person nicht so kurz vor dem Problem beseitigen.
quelle
Ich glaube nicht, dass es eine einzige Lösung gibt, die in allen Fällen funktioniert, da dies von der Empfindlichkeit der Daten in den Konfigurationsdateien oder der von Ihnen verwendeten Programmiersprache und so vielen anderen Faktoren abhängen kann. Ich denke jedoch, dass es wichtig ist, die Konfigurationsdateien für alle Umgebungen unter Quellcodeverwaltung zu halten, damit Sie immer wissen, wann sie geändert wurden und von wem und was noch wichtiger ist, sie wiederherstellen können, wenn etwas schief geht. Und sie werden.
Also hier ist, wie ich es mache. Dies ist normalerweise für NodeJS-Projekte, aber ich denke, es funktioniert auch für andere Frameworks und Sprachen.
Ich erstelle ein
configs
Verzeichnis im Stammverzeichnis des Projekts und speichere unter diesem Verzeichnis mehrere Dateien für alle Umgebungen (und manchmal auch separate Dateien für die Umgebung jedes Entwicklers), die alle in der Quellcodeverwaltung verfolgt werden. Und da ist die eigentliche Datei, die der Code verwendet, benanntconfig
im Stammverzeichnis des Projekts. Dies ist die einzige Datei, die nicht verfolgt wird. So sieht es also ausWenn jemand das Projekt auscheckt, kopiert er die Konfigurationsdatei, die er in der nicht verfolgten
config
Datei verwenden möchte, und kann sie nach Belieben bearbeiten. Er ist jedoch auch dafür verantwortlich, diese Änderungen zu kopieren, bevor er sie nach Bedarf in die anderen Umgebungsdateien überträgt.Auf Servern kann die nicht verfolgte Datei einfach eine Kopie (oder Referenz) der verfolgten Datei sein, die dieser Umgebung entspricht. In JS können Sie einfach 1 Zeile haben, um diese Datei zu benötigen.
Dieser Ablauf mag zunächst etwas kompliziert sein, hat jedoch große Vorteile: 1. Sie müssen sich keine Sorgen machen, dass eine Konfigurationsdatei auf dem Server gelöscht oder geändert wird, ohne über ein Backup zu verfügen. 2. Dasselbe gilt, wenn ein Entwickler eine benutzerdefinierte Konfiguration auf seinem Server hat Maschine und seine Maschine funktionieren aus irgendeinem Grund nicht mehr 3. Vor jeder Bereitstellung können Sie die Konfigurationsdateien für
development
undstaging
zum Beispiel unterscheiden und prüfen, ob etwas fehlt oder defekt ist.quelle
Wir lassen nur die Produktionskonfigurationsdatei eingecheckt. Es liegt in der Verantwortung des Entwicklers, die Datei zu ändern, wenn sie für die Bereitstellung oder Entwicklung aus dem Quellensafe gezogen wird. Das hat uns in der Vergangenheit verbrannt, also würde ich es nicht vorschlagen.
quelle
Ich stand vor dem gleichen Problem und fand eine Lösung dafür. Ich habe zuerst alle Dateien zum zentralen Repository hinzugefügt (auch die Entwickler-Dateien).
Wenn ein Entwickler die Dateien aus dem Repository abruft, ist auch die Entwicklerkonfiguration vorhanden. Bei Änderungen an dieser Datei sollte Git diese Änderungen nicht kennen. Auf diese Weise können Änderungen nicht in das Repository übertragen werden, sondern bleiben lokal.
Ich habe dies mit dem Befehl git gelöst :
update-index --assume-unchanged
. Ich habe eine Bat-Datei erstellt, die im Prebuild der Projekte ausgeführt wird, die eine Datei enthalten, deren Änderungen von Git ignoriert werden sollten. Hier ist der Code, den ich in die Fledermausdatei eingefügt habe:In meinem Prebuild habe ich die Bat-Datei aufgerufen, zum Beispiel:
Ich habe auf SO eine bat-Datei gefunden, die die richtige Konfigurationsdatei in die Datei web.config / app.config kopiert. Ich nenne diese Bat-Datei auch im Prebuild. Der Code für diese Fledermausdatei lautet:
In meinem Prebuild habe ich die Bat-Datei aufgerufen, zum Beispiel:
quelle