Mit msbuild möchte ich eine Konfigurationsdatei mit Werten von teamcity aktualisieren
Habe ich einige XML-Code, der ungefähr so aussieht:
<?xml version="1.0" encoding="utf-8"?>
<XmlConfig instancetype="XmlConfig, Processing, Version=1.0.0.0, Culture=neutral">
<item>
<key>IsTestEnvironment</key>
<value>True</value>
<encrypted>False</encrypted>
</item>
<item>
<key>HlrFtpPutDir</key>
<value>C:\DevPath1</value>
<encrypted>False</encrypted>
</item>
<item>
<key>HlrFtpPutCopyDir</key>
<value>C:\DevPath2</value>
<encrypted>False</encrypted>
</item>
....
</Provisioning.Lib.Processing.XmlConfig>
In TeamCity ich habe viele system-Eigenschaften:
system.HlrFtpPutDir H:\ReleasePath1
system.HlrFtpPutCopyDir H:\ReleasePath2
Welche Art von MsBuild-magic kann ich verwenden, um schieben Sie diese Werte in meine XML-Datei? Insgesamt gibt es 20 oder so posten.
InformationsquelleAutor der Frage Loofer | 2011-12-28
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich nur gebloggt über diesen ( http://sedodream.com/2011/12/29/UpdatingXMLFilesWithMSBuild.aspx ), aber ich ' ll fügen Sie die info hier auch für Sie.
Heute sah ich gerade eine Frage gepostet auf StackOverflow zu Fragen, wie man zum aktualisieren einer XML-Datei mithilfe von MSBuild während ein CI-build ausgeführt vom Team City.
Es ist nicht die richtige Antwort, es gibt verschiedene Möglichkeiten, wie Sie können aktualisieren einer XML-Datei in einem "build". Vor allem:
1 Verwenden SlowCheetah zu verwandeln, die für Sie Dateien
Bevor Sie beginnen, Lesen zu weit in diesem post, lassen Sie mich gehen über die option #3 zuerst, weil ich denke, es ist die einfachste Methode und die meisten leicht zu pflegen. Sie können download meiner SlowCheetah XML-Transformationen in Visual Studio add-in. Sobald Sie dies tun, für Ihre Projekte sehen Sie einen neuen Menübefehl transformieren eine Datei erstellen (für web-Projekte auf Paket/veröffentlichen). Wenn Sie erstellen von der Befehlszeile oder einem CI-server die Transformationen laufen sollte.
2 Verwenden Sie die TransformXml Aufgabe direkt
Wenn Sie möchten, eine Technik, bei der Sie eine "main" - XML-Datei, und Sie wollen in der Lage sein zu enthalten Transformationen, die Datei in einer separaten XML-Datei können Sie dann die TransformXml Sie die Aufgabe direkt. Für mehr info siehe meine früheren blog-post auf http://sedodream.com/2010/11/18/XDTWebconfigTransformsInNonwebProjects.aspx
3 Verwenden Sie die integrierte in XmlPoke Aufgabe
Manchmal ist es nicht sinnvoll, eine XML-Datei erstellen mit Transformationen für jedes XML-Datei. Zum Beispiel, wenn Sie eine XML-Datei, die Sie ändern möchten, einen einzelnen Wert, sondern um 10 verschiedene Dateien, die die XML-transformation-Ansatz nicht gut skaliert. In diesem Fall könnte es einfacher sein zu verwenden, die XmlPoke Aufgabe. Hinweis: dies erfordert MSBuild 4.0.
Im folgenden werden die Inhalte der sample.xml (kam von der Frage ALSO).
So, in diesem Fall wollen wir für die Aktualisierung der Werte des value-Elements. Also das erste, was wir tun müssen, ist zu kommen mit der korrekten XPath für alle Elemente, die wir aktualisieren möchten. Wir können In diesem Fall verwenden Sie den folgenden XPath-Ausdrücke für jedes Wert-element.
Ich gehe nicht über das, was Sie tun müssen, um herauszufinden, die korrekte XPath-denn das ist nicht der Zweck von diesem post. Es gibt eine Reihe von XPath im Zusammenhang mit Ressourcen auf dem Internet herum. In der Ressourcen-Abschnitt habe ich verlinkt mit der online-XPath-tester, die ich immer benutze.
Nun, wir haben den gewünschten XPath-Ausdrücke müssen wir konstruieren unsere MSBuild-Elemente, um alles aktualisiert. Hier ist die gesamte Technik:
Für #2, wenn Sie sind nicht vertraut mit MSBuild-Batchverarbeitung dann würde ich empfehlen, die mein Buch gekauft haben, oder Sie kann nehmen Sie einen Blick auf die Ressourcen, die ich habe online über die Dosierung (der link ist unten im Abschnitt Ressourcen). Nachfolgend finden Sie eine einfache MSBuild-Datei, die ich erstellt habe, UpdateXm01.proj.
Den teilen um Aufmerksamkeit zu schenken, ist die XmlConfigUpdates Element und die Inhalte der UpdateXml Aufgabe selbst. In Bezug auf die XmlConfigUpdates,, der name ist beliebig, Sie können unabhängig Namen, die Sie wollen, können Sie sehen, dass die Include-Wert (die in der Regel verweist auf eine Datei) einfach Links auf ConfigUpdates-SampleXml. Der Wert für die Include-Attribut wird hier nicht verwendet. Ich würde einen eindeutigen Wert für die Include-Attribut für jede Datei, die Sie aktualisieren möchten. Dies macht es einfacher für Menschen zu verstehen, was diese Gruppe von Werten ist, und Sie später verwenden können, um batch-updates. Die XmlConfigUpdates Element, hat diese beiden Metadaten-Werte:
- Dieser enthält den XPath-erforderlich, um wählen Sie das element aus, das aktualisiert
- Dieser enthält den neuen Wert für das element, die gehen, um aktualisiert werden
Innerhalb der UpdateXml Ziel ist, können Sie sehen, dass wir die XmlPoke Aufgabe und die Weitergabe der XPath - %(XmlConfigUpdate.XPath) und den Wert als %(XmlConfigUpdates.NewValue). Da sind wir mit der % ( ... ) - syntax auf ein Element dieser start MSBuild-Batchverarbeitung. Batchverarbeitung ist, wo mehr als eine operation erfolgt über eine "batch" - Werte. In diesem Fall gibt es zwei eindeutige Chargen (1 für jeden Wert in XmlConfigUpdates), so dass die XmlPoke Aufgabe wird aufgerufen, zwei mal. Batchverarbeitung kann verwirrend sein, so stellen Sie sicher, zu Lesen, wenn Sie nicht vertraut sind.
Nun können wir msbuild.exe um den Prozess zu starten. Die resultierende XML-Datei ist:
So, jetzt können wir sehen, wie einfach es war, mit XmlPoke Aufgabe. Lassen Sie uns nun nehmen Sie einen Blick an, wie können wir erweitern das Beispiel um updates zu verwalten, um die gleiche Datei für eine weitere Umgebung.
, Wie zum verwalten von updates auf die gleiche Datei für mehrere unterschiedliche Ergebnisse
Da haben wir eine Sache, die halten alle benötigten XPath als auch die neuen Werte, die wir haben, ein bisschen mehr Flexibilität bei der Verwaltung mehrerer Umgebungen. In diesem Szenario haben wir die gleiche Datei, die wir wollen, zu schreiben, aber wir schreiben müssen verschiedene Werte basierend auf der Ziel-Umgebung. Dies zu tun ist ziemlich einfach. Werfen Sie einen Blick auf den Inhalt UpdateXml02.proj unten.
Die Unterschiede sind ziemlich einfach, ich stellte eine neue Eigenschaft, TargetEnvName, die lässt uns wissen, was die Zielumgebung ist. (Anmerkung: ich habe nur die Eigenschaft name, mit welchem Namen du willst). Auch können Sie sehen, dass es zwei ItemGroup-Elemente mit unterschiedlichen XmlConfigUpdate Elemente. Jede Artikelgruppe ist ein Zustand, basierend auf dem Wert von TargetEnvName also nur eine der beiden ItemGroup-Werte verwendet werden. Jetzt haben wir eine einzelne MSBuild-Datei, die die Werte für beide Umgebungen. Beim erstellen geben Sie einfach in der Eigenschaft TargetEnvName, zum Beispiel msbuild .\UpdateXml02.proj /p:TargetEnvName=Env02. Wenn ich ausgeführt, das die resultierende Datei enthält:
Können Sie sehen, dass die Datei aktualisiert wurde mit unterschiedlichen Pfaden, in des value-Elements.
4 Verwenden Sie ein Drittanbieter-task-Bibliothek
Wenn Sie nicht mit MSBuild 4, dann müssen Sie ein Drittanbieter-task-Bibliothek wie das MSBuild Extension Pack (link in Ressourcen).
Hoffe, das hilft.
Ressourcen
InformationsquelleAutor der Antwort Sayed Ibrahim Hashimi
Ändern wir die config-Werte für unsere verschiedenen build-Umgebungen (z.B. dev, staging, Produktion) mithilfe von config-Transformationen. Ich gehe davon aus, dass die config verwandelt wird wahrscheinlich nicht für Sie arbeiten, aber wenn es eine Möglichkeit, check-out diese Antwort, die zeigt, wie sich zu bewerben .Net config-Transformationen auf XML-Datei.
Alternative wäre, um die FileUpdate bauen Aufgabe aus der MSBuild Community Tasks Projekt. Diese Aufgabe können Sie mithilfe von regulären Ausdrücken suchen und ersetzen von Inhalten in einer Datei. Hier ist ein Beispiel:
<FileUpdate Files="version.txt" Regex="(\d+)\.(\d+)\.(\d+)\.(\d+)" ReplacementText="$1.$2.$3.123" />
Weil Sie würde vorbei TeamCity system Eigenschaften in FileUpdate wenn Sie sich entscheiden, wählen Sie die zweite option, werfen Sie einen Blick auf diese Frage zu sehen, wie die system-Eigenschaften, auf die verwiesen werden kann, die in einem MSBuild-Skript.
InformationsquelleAutor der Antwort Jonathan McIntire