Versionskontrolle und persönliche Konfigurationsdatei


36

Unser Projekt verwendet eine benutzerspezifische Konfigurationsdatei. Diese Datei befindet sich derzeit nicht in der Versionskontrolle, da sie für jeden Benutzer unterschiedlich ist. Das Problem besteht darin, dass die anderen Entwickler immer dann, wenn ein Entwickler ein neues Modul hinzufügt, das konfiguriert werden muss, oder wenn sie den Namen eines vorhandenen Moduls ändern, Fehler erhalten, weil ihre privaten Konfigurationsdateien nicht aktualisiert werden.

Um das Problem zu lösen, haben wir uns überlegt, mit zwei Konfigurationsdateien zu arbeiten: einer Standard- / globalen Konfigurationsdatei, die sich in der Versionskontrolle befindet und von jedem Entwickler, der ein neues Modul hinzufügt, regelmäßig aktualisiert wird, und einer privaten Konfigurationsdatei, die nicht verwendet wird der Versionskontrolle und enthält nur die benutzerspezifischen Änderungen.

Dies scheint jedoch immer noch eine Ad-hoc-Lösung zu sein.

Können Sie eine bessere Lösung vorschlagen?

Was machen die Profis?



4
Boggle ... Warum in aller Welt gestatten Sie Entwicklern überhaupt, Module umzubenennen und die Kundenkonfiguration zu einem anderen Zeitpunkt als einem größeren Upgrade zu unterbrechen ?
Mark Booth

@ JK Ja, es gibt sogar eine bessere Übereinstimmung: stackoverflow.com/questions/1974886/…
Erel Segal-Halevi

Ich bin verwirrt. Wie ist das kein Problem, wenn Sie Upgrades installieren.
Joshua

6
Es ist überhaupt keine Ad-hoc-Lösung. Die primäre Konfigurationsdatei befindet sich in der Versionskontrolle und wird von den benutzerspezifischen Konfigurationsdateien überschrieben. Natürlich muss der Umfang der benutzerspezifischen Konfiguration minimiert werden, aber möglicherweise ist ein geringer Umfang unvermeidbar.
William Payne

Antworten:


22

Obwohl Sie hier bereits einige gute Antworten erhalten haben, verpassen die meisten die eigentliche Ursache Ihres Problems: Ihre Benutzerkonfigurationsdateien scheinen mehr als nur benutzerspezifische Informationen zu enthalten, sie enthalten auch (möglicherweise redundante) Informationen, die an anderer Stelle der Versionskontrolle unterliegen , wahrscheinlich in verschiedenen Dateien, wie Modulnamen.

Ich kann mir hier zwei mögliche Lösungen vorstellen:

  • versuchen Sie, diese Informationen streng zu trennen. Verwenden Sie beispielsweise keine Modulnamen in Ihrer Benutzerkonfiguration. Verwenden Sie ID-Nummern (z. B. GUIDs), um auf Module zu verweisen, und lassen Sie zu, dass sich diese ID-Nummern niemals ändern, nachdem sie einem Modul zugewiesen wurden. Das hat natürlich wahrscheinlich den Nachteil, dass Ihre Benutzerkonfigurationsdateien einen Teil ihrer Einfachheit verlieren, die sie jetzt haben könnten. Möglicherweise müssen Sie ein GUI-Tool erstellen, um Ihre Konfigurationsdateien zu bearbeiten, anstatt einen Nur-Text-Editor zu verwenden.

  • Geben Sie Ihrem Konfigurationsdateiformat eine Versionsnummer und weisen Sie ihm bei jeder Änderung eines Modulnamens eine neue Versionsnummer zu. Anschließend können Sie ein Upgrade-Skript bereitstellen, das die Versionsnummern überprüft. Wenn die Konfigurationsdatei nicht aktuell ist, werden alle in der Datei gefundenen Modulnamen geändert und anschließend die Versionsnummer erhöht. Dies kann automatisiert werden, sodass die Aktualisierung Ihre Teamkollegen bei ihrer täglichen Arbeit nicht stört.

BEARBEITEN: Nach dem erneuten Lesen Ihres Beitrags halte ich Ihre vermeintliche Lösung für angemessen, solange neue Module nur hinzugefügt, aber nicht umbenannt werden. Was ich oben geschrieben habe, erlaubt es, die Modulnamen oder die Struktur der Konfiguration bestehender Module nachträglich zu ändern. Aber wenn Sie das nicht brauchen, würde ich mich an die einfachste Lösung halten.


11

Es ist eine vernünftige Lösung.

Sie benötigen eine Möglichkeit, die Anfangswerte aller neuen Konfigurationselemente anzugeben. Diese müssen irgendwo gespeichert werden und eine globale, schreibgeschützte Konfigurationsdatei ist die naheliegende Wahl.

Wenn dann jeder Benutzer seine persönliche Konfiguration ändert, schreibt er diese Änderungen in seine lokale Kopie.

Ihr Code muss zuerst die globale und die benutzerspezifische Konfiguration lesen, um geänderte Werte zu überschreiben. Dies ist weitaus einfacher als das lokale zu lesen und dann zu ermitteln, welche nicht festgelegt wurden und daher aus der globalen Einstellungsdatei gelesen werden müssen.

Wenn Sie XML für die Speicherung verwenden, müssen Sie sich nicht um den Fall kümmern, dass Sie Einstellungen entfernen. Sie werden nicht von der Benutzerkopie der Datei angefordert, und wenn Sie die Datei beim Speichern neu erstellen, werden sie entfernt, wenn die Anwendung nach der Änderung zum ersten Mal verwendet wird.


3

Wir haben eine etwas interessante Lösung, wir sind hauptsächlich PHP-Entwickler, daher verwenden wir Phing, mit dem Sie automatisierte Aufgaben erstellen können, die in PHP geschrieben sind. Anstatt unser normales SVN-Update durchzuführen, führen wir ein "PHING-Update" durch, das SVN-Update aufruft. und dann ersetzt unsere configs durch die richtigen Variablen, zum Beispiel eine config:

$db_user = "${test.db_user}";

Die Konfigurationsdateien sind also alle mit dieser interessanten Syntax versioniert, und dann generieren wir eine adhoc, nicht versionierte Konfigurationsdatei für meine spezifische Instanz, die diese "Variablen" durch nicht versionierte Einstellungen ersetzt, die in nicht versionierten INI-Dateien angegeben sind. Auf diese Weise können wir alle benutzerspezifischen Dateien ändern und die Änderungen in allen anderen Arbeitskopien einfügen.


2

Das Programm sollte eine Standardeinstellung im Code haben, wenn der Wert nicht in der Konfigurationsdatei gefunden wird. Auf diese Weise wird Ihr Upgrade-Pfad reibungsloser, wenn neue Elemente hinzugefügt werden, und Ihre Benutzer können darauf zurückgreifen, wenn sie die Konfigurationsdatei ebenfalls durcheinander bringen.

Ein weiteres komplexeres Beispiel wäre das Starten eines Programms oder ein anderer wichtiger Punkt. Öffnen Sie die Konfigurationsdatei mit einem Initialisierungsmodul und fügen Sie die fehlenden Standardeinstellungen hinzu. Dies scheint jedoch ziemlich umfangreich zu sein.


+1 für die Erwähnung, dass dies nicht nur ein Problem für Entwickler ist, sondern ein allgemeines Bereitstellungsproblem.
sleske

2

Fügen Sie eine Versionsnummer in die persönliche Konfigurationsdatei ein (die Versionsnummer des Konfigurationsdateiformats).

Lassen Sie den Code, der die persönliche Konfigurationsdatei verarbeitet, die Versionsnummer überprüfen und führen Sie ein Update durch, wenn diese veraltet ist. Grundsätzlich muss jeder, der eine Änderung vornimmt, die vorhandene Konfigurationsdateien beschädigt, die Versionsnummer des Konfigurationsdateiformats erhöhen und eine Prozedur schreiben, um die Konfigurationsdateien der vorherigen Version zu aktualisieren (Abschnitte umbenennen usw.) und neu zu speichern Sie.

Wahrscheinlich möchten Sie sowieso einen solchen Prozess für Endbenutzer, sodass Sie ihn genauso gut verwenden können, um das Leben Ihrer Entwickler zu vereinfachen.


1

In der Regel wird eine Konfigurationsdatei mit Standardwerten in das Repository eingecheckt. Dies können beispielsweise die Werte sein, die auf dem Testserver benötigt werden. Wenn ein Entwickler dann die Datei auscheckt, hat er alle Werte. Wenn ein neues Feld hinzugefügt oder ein Feld entfernt wird, wird dies in einer Zusammenführung behandelt. Ein Entwickler checkt den erforderlichen Wert für den Zielserver ein und überprüft keine anderen Änderungen an Feldern, die für seine persönliche Entwicklungsumgebung bestimmt sind.

Es sorgt dafür, dass die Zusammenführung richtig durchgeführt wird, aber es scheint mir ziemlich sicher zu sein.


Das scheint eher fehleranfällig zu sein; Ich habe gesehen, dass dies erledigt ist, aber Entwickler haben versehentlich persönliche Einstellungen überprüft, die dann die von anderen Entwicklern verwendeten Einstellungen überschrieben :-(. Dies bedeutet auch, dass der gesamte Baum in VCS-Werkzeugen immer als "geändert" angezeigt wird, was sehr bedenklich ist unpraktisch.
sleske

@sleske Es erfordert eine gewisse Disziplin. Aber ehrlich gesagt würde ich von den meisten Entwicklern die Fähigkeit erwarten, dies zu tun.
Thomas Owens

1

Was wir hier tun, ist das Erstellen von Einstellungsblöcken. Das kann in Zend so gemacht werden:

[production]
key1: parameter1
key2: parameter2

[testing: production]
key1: parameter2
key3: parameter4

Dies bedeutet, dass das Testen die Produktion erbt und mit key3 erweitert. Alles, was jeder Entwickler dann tun muss, ist seine Umgebung einzustellen (in diesem Fall Testen oder Produzieren).


Die Einstellungen sind benutzerspezifischer. Dazu gehören Installationsordner für Anwendungen, persönliche Einstellungen usw. Es reicht also nicht aus, nur zwischen zwei vordefinierten Umgebungen zu wählen.
Erel Segal-Halevi

Abhängig davon, wie viele Einstellungen und wie sie verwendet werden, können Sie Ressourcen in der INI-Datei für Zend verwenden. Nicht sicher, ob dies auch auf Ihr Problem zutrifft.
Agilix

Ich brauchte eine allgemeinere Lösung, die alle Arten von benutzerspezifischen Einstellungen handhaben kann, nicht nur Ressourcen.
Erel Segal-Halevi

Nur ein Gedanke hier, aber wäre es nicht besser, diese in einer Datenbank zu speichern? Zumindest die Vorlieben. Und dann können Sie die einen Benutzer koppeln. Wenn nicht, war es nur ein Gedanke;)
Agilix

0

Dies ist eine nützliche Lösung, die auf dem Beitrag basiert: Kennwörter in der Quellcodeverwaltung behalten

Zusammenfassend besteht die Strategie darin, "eine verschlüsselte Version der Konfigurationsdatei in der Quellcodeverwaltung zu behalten und dann ein Mittel bereitzustellen, mit dem der Benutzer diese Daten verschlüsseln und entschlüsseln kann".

  1. Erstellen Sie eine Dummy-Comfig-Datei und geben Sie sie ein.
  2. Erstellen Sie ein Makefile, das die Konfigurationsdatei verschlüsseln und entschlüsseln kann
  3. Speichern Sie das Makefile und die verschlüsselte Konfigurationsdatei im Repository
  4. Das Makefile fragt nach einem Passwort und wie Sie den Autor nach dem Passwort fragen können.
  5. Wenn das Makefile beim Erstellen des Projekts nicht ausgeführt wurde, teilen Sie dem Benutzer console.error mit ("Konfigurationsdatei [conf / settings.json] fehlt! Haben Sie das Ausführen vergessen make decrypt_conf?");
  6. Es wird eine Überprüfung beschrieben, um sicherzustellen, dass die Konfigurationsdatei auf dem neuesten Stand ist.

1
-1, da dies die ursprüngliche Frage überhaupt nicht beantwortet. Antworten, die nur aus einem Link und keiner Erklärung bestehen, sind für das Q / A-Format von Stack Exchange nicht hilfreich, da externe Links möglicherweise irgendwann verschwinden und keinen Hinweis auf die vorgeschlagene Antwort geben.
Derek

1
Dies ist jedoch ein interessanter Beitrag.
Erel Segal-Halevi

0

Wir haben ein Tool namens Config erstellt , das solche Konfigurationsprobleme behandelt. Sie erstellen (oder importieren) 1 Master-Konfigurationsdatei. Erstellen Sie dann eine Umgebung mit dem Namen Local. Erstellen Sie in der lokalen Umgebung mehrere Instanzen, eine Instanz pro Benutzer. Wenn Sie eine allgemein übliche Änderung vornehmen müssen, z. B. einen neuen Konfigurationseintrag hinzufügen oder den Modulnamen ändern, nehmen Sie die Änderung einfach vor, und die Änderung wird allgemein übernommen. Wenn Sie eine Instanz- / Benutzeränderung vornehmen möchten, legen Sie diesen Konfigurationswert als Variable fest und ändern Sie dann die Variable. Diese Änderung wird nur auf Ihre Instanz / Ihren Benutzer angewendet. Alle diese sind unter Versionskontrolle. Sie stellen die Konfigurationsdateien per Push oder Pull bereit. Die Pull-Option ähnelt git pull, gilt jedoch für diese bestimmte Instanz / diesen bestimmten Benutzer.

Config bietet Ihnen zusätzliche Funktionen wie das Vergleichen von Konfigurationen zwischen Benutzern, Suchen, Markieren, Validieren und Workflow. Es ist SaaS, also nicht wirklich für diejenigen, die noch nicht bereit für die Cloud sind, aber wir haben einen lokalen Plan.


Ich denke, ein SaaS zum Verwalten der Entwicklerkonfiguration wäre ein Overkill ... Aber das ist meiner Meinung nach einfach. Wenn die Konfiguration vertrauliche Daten enthält (unwahrscheinlich, da diese wahrscheinlich zum Testen auf eigenen Workstations verwendet werden), ist dies ein sofortiges No-Go.
Mael

Ich denke nicht, dass Config ein Overkill ist, wenn man bedenkt, wie einfach das Einrichten ist, im Vergleich zu der Zeit, die man benötigt, um die Lösung zu finden, die Community zu befragen, sie zu implementieren und zu warten. Config funktioniert auf jeder Plattform, jedem Format, jeder Sprache und jeder Bibliothek, sodass Sie es nur einmal lernen können. Bei sensiblen Daten gibt es eine clientseitige Verschlüsselungsoption, einen lokalen Tresor, wenn Sie so wollen. Benutzer, die All-In gehen, können intern installieren oder eine VPC verwenden.
Bienvenido David
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.