2016-04-14 8 views
2

Ich verwende externe Konfigurationsdateien für verschiedene dynamische Abschnitte in meinen web.config-Dateien. Im Wesentlichen wurden alle dynamischen Variablen zwischen Umgebungen (Prod, UAT, Test, Dev usw.) in generische benannte .config-Dateien ausgelagert.Externe .config-Dateien wieder in web.config einbinden, die die configSource-Extraktion verwendet haben

Meine web.config ist auch generisch, so dass alle Umgebungen die gleiche web.config verwenden (da Dinge wie Verbindungszeichenfolgen usw. in den externen Dateien sind). Alle Dateien sind in den Umgebungen gleich benannt. Wenn wir also eine Veröffentlichung machen, müssen wir nur das Verzeichnis web.config und \ Configs * während einer Veröffentlichung im Auge behalten.

Ich möchte (über etwas wie XSLT oder PowerShell) alle Informationen in diesen externen * .config-Dateien wieder in die web.config zusammenführen, damit ich das (jetzt zusammengelegte) Web vergleichen kann. config mit der von den Entwicklern bereitgestellten Version.

So kann unser gegenwärtiges web.config sagen:

<sessionState configSource="Configs\System.Web.SessionStateConnectionString.config" /> 

Und in der System.Web.SessionStateConnectionString.config-Datei für die Prod Umwelt:

<sessionState mode="StateServer" cookieless="true" timeout="20"/> 

Und für die Testumgebung hat :

<sessionState mode="InProc" cookieless="true" timeout="20"/> 

Ich möchte alle externen * .config-Dateien zurück in eine web.co zusammenführen nfig, so dass die Datei im Wesentlichen so fertig ist, als wäre configSource noch nie verwendet worden. Dadurch kann ich ein Diff oder WinMerge in der Datei web.config (nachdem es zusammengeführt wurde) und was der Entwickler uns gibt, zeigen, welche Dinge geändert wurden, wie neue Schlüssel hinzugefügt oder neue Module verwendet.

Was wäre der beste Weg, um dies zu tun?

Antwort

0

Ich habe keinen einfachen Ansatz. Ich hoffe, dass es einen gibt, und es würde uns beiden helfen.

Ich fand die einzige zuverlässige Möglichkeit, eine große Menge an Konfigurationsdatei während der Bereitstellung ohne Fehler zu ändern ist die eigentliche XML-Bearbeitung. Was bedeutet, folgen Sie der XML-Struktur.

Damit die Aufgabe, die Sie Archiv versuchen, ändert sich nicht nur einen XML-Wert

Von

<sessionState configSource="Configs\System.Web.SessionStateConnectionString.config" /> 

Um

<sessionState configSource="abc.config" /> 

aber auch XML Eltern Namen zu ändern

Von

<sessionState configSource="abc.config" /> 

Um

<sessionState mode="stateServer" /> 

Dann benötigen Sie mehr Kind anhängen, um es

<sessionState mode="StateServer" cookieless="true" timeout="20"/> 

So zu machen, sparte ich alle Umgebungsvariablen I in einem Deployment-Tool benötigen, stattdessen eine andere XML verwenden für Vergleich.Während des Einsatzes, mein Bereitstellungsskript (Powershell) laden direkt die Konfigurationsdatei $config = [xml](get-content $webconfig) und laden Sie die Variablen von Deployment-Tool

Für eine einfache Änderung würde ich

$node = $config.configuration.sessionState | where {$_.configSource -eq 'Configs\System.Web.SessionStateConnectionString.config'} 
$node.configSource = $Prod_session_config #"abc.config" 

Für die Änderung Sie braucht, werde ich abnehmen configSource von sessionState und reattach 3 neues Kind mode, cookieless, timeout mit ihrem gewünschten Wert.

Mit diesem gesagt ist dies ein sehr langes Bereitstellungsskript. Sie können Ihre eigenen Helfer erstellen, damit es viel besser aussieht, etwa replace-config $config_keyname $config_keyvalue. Selbst mit Helfern, um häufige Operationen zu reduzieren, die Sie benötigen, ist dies immer noch eine einfache Codezeile, abhängig davon, wie viele bewegliche Teile Ihre Anwendung hat.

Dies würde wahrscheinlich Wochen dauern, um zu erreichen. Sobald dies geschehen ist, ist es unwahrscheinlich, dass es zu massiven Änderungen kommt, aber Sie müssen immer noch eine sehr gute Kommunikation mit den Entwicklern haben. Sie müssen diese aktualisieren, wenn eine neue Umgebungsvariable eingeführt wird.

Diese Aufgabe können Sie auch mit Konfigurationsverwaltungstools wie Puppet Augeas erledigen, aber ich denke nicht, dass es einfacher ist, wenn Sie ein paar gute Helfer in der Powershell aufschreiben. Ich habe mich auch mit XSLT befasst, konnte aber keine praktische Möglichkeit finden, es mit meinem Bereitstellungstool zu verwenden.

Dies ist meine Lösung mit begrenzten devops Erfahrung und ich hoffe verzweifelt, es wäre eine bessere wie Sie.