2 Stimmen

Wie führe ich eine web.config-Transformation mit MSBuild oder MSDeploy durch?

Ich habe eine Reihe verschiedener Konfigurationen ausprobiert, aber nicht das gewünschte Ergebnis erzielt.

TL;DR

Ich versuche, Config-Transformationen in meinem Build-Prozess hinzuzufügen und bin auf der Suche nach dem richtigen Weg, um es von MSBuild zu tun, so dass es in meinen Bereitstellungen über MSDeploy zeigt.

Hintergrund

  • Ich habe eine WebApp (MVC3), eine Core app (CS Class Lib), und zwei Testklassenbibliotheken, eine für jede.
  • Ich habe ein Build-Skript in meiner Lösung, die MSBuild zum Kompilieren verwendet.
  • Eines dieser MSBuild-Ziele wird mit MSDeploy auf einem IIS-Server bereitgestellt
  • Dieser Prozess funktioniert bisher sowohl manuell als auch über CruiseControl.NET

Ziel

Ich möchte Web.Config Transformationen zu diesem Prozess hinzufügen. Ich dachte, ich würde etwas einfaches auf den ersten, wie eine app-Einstellung namens "PEAppsEnvironmentName", die ich machen würde, Dev, Test oder Prod basierend auf der aktuellen Umgebung tun.

Bisherige Theorie

Für mich sieht es so aus, als ob ich beim Paketieren mit MSDeploy die Konfigurationsdatei nicht umwandle.

Wenn ich MSBuild mit der DeployOnBuild-Option auf true gesetzt ausführen, erstellt es ein anderes Paket, das die entsprechend transformiert config hat . Es scheint nur, dass ich es irgendwie nicht hinbekomme, dass alles zusammenpasst. Das Endergebnis ist, dass die Webseite "None" (die ursprüngliche Einstellung) anstelle der umgewandelten Zeichenfolge "Development" anzeigt.

Ich denke, wenn ich herausfinden könnte, wie ich MSDeploy während der Paketierungsphase verwenden kann, um die MSConfig zu transformieren, wäre ich startklar.

Code

Meine web.config-Datei

<appSettings>
      <add key ="PEAppsEnvironmentName" value="None"/>
      ...  
</appSettings>

Meine Web.Dev.config-Datei

<appSettings>
    <add key ="PEAppsEnvironmentName" xdt:Transform="Replace" xdt:Locator="Match(key)" value="Development" />
</appSettings>

Meine MSBuild-Ziele

Eigenschaftsgruppe mit der Standardkonfiguration "Dev"

<PropertyGroup>
    <Configuration Condition="'$(Configuration)' == ''">Dev</Configuration>
</PropertyGroup>

Mein MSBuild-"Kompilier"-Ziel

   <Target Name="Compile" DependsOnTargets="Init">
        <MSBuild Projects="@(SolutionFile)" Targets="Rebuild" Properties="OutDir=%(BuildArtifacts.FullPath);DeployOnBuild=True"/>
    </Target>

Mein MSBuild-"Paket"-Ziel

<Target Name="Package" DependsOnTargets="Compile;Test">
    <PropertyGroup>
        <PackageDir>%(PackageFile.RootDir)%(PackageFile.Directory)</PackageDir>
        <Source>%(WebSite.FullPath)</Source>
        <Destination>%(PackageFile.FullPath)</Destination>
    </PropertyGroup>
    <MakeDir Directories="$(PackageDir)"/>
    <Exec Command='"@(MSDeploy)" -verb:sync -source:iisApp="$(Source)" -dest:package="$(Destination)" '/>
</Target>

Mein MSBuild "Deploy" Ziel

(geschrubbt für PWs, etc.)

   <Target Name='Deploy' DependsOnTargets='Package'>
        <PropertyGroup>
            <Source>%(PackageFile.FullPath)</Source>
        </PropertyGroup>
        <Exec Command ='"@(MsDeploy)" -verb:sync -source:package="$(Source)" -dest:iisApp=PEApps,computerName=$(WebServerName),username=[User],password=[Password]'/>
    </Target>

1voto

Ich bin mir nicht sicher, ob ich mit Ihnen auf einer Wellenlänge bin, aber ich werde meinen Eindruck von Ihrer Frage zusammenfassen. Sie haben ein bestehendes Webprojekt, das sich in einer Lösung mit anderen Projekten befindet. Sie müssen in der Lage sein, das Webprojekt so zu verpacken, dass Sie es an mehreren Zielen veröffentlichen können.

Ich habe ein NuGet-Paket erstellt, das genau für diesen Zweck verwendet werden kann. Es heißt paket-web . Wenn Sie es zu Ihrem Webprojekt hinzufügen, wird der Paketierungsprozess aktualisiert. Wenn Sie ein Paket erstellen, werden einige zusätzliche Dateien in das Paket aufgenommen, einschließlich aller web.config Transformationsdateien. Neben dem Paket wird auch eine .ps1-Datei erstellt. Sie können dieses Skript verwenden, um das Paket zu veröffentlichen. Es fragt Sie nach der auszuführenden Transformation und nach allen Web Deploy-Parametern. Sie können die Antworten auch in einer Datei speichern und sie dann einfach an die .ps1-Datei übergeben, so dass Sie nicht-interaktive Veröffentlichungen durchführen können. Ich habe ein 5-minütiges Video dazu erstellt unter http://nuget.org/packages/PackageWeb Paket Web: http://sedodream.com/2012/03/14/PackageWebUpdatedAndVideoBelow.aspx . FYI dies ist noch nicht mit VS 2012 arbeiten, aber ich bin auf die Behebung arbeiten und sollte es aktualisiert haben, bis VS 2012 freigegeben wird.

Wenn Sie das nicht nützlich finden, können Sie sehen, wie ich die Lösung implementiert habe unter https://github.com/sayedihashimi/package-web und Sie sollten Beispiele für alles sehen, was Sie tun müssen, um Ihre eigene Version zu erstellen.

FYI, wenn Sie benötigen, um alle Dateien neben web.config auf Paket erstellen dann sollten Sie einen Blick auf meine VS-Erweiterung zu transformieren SlowCheetah . Hier ist ein Blog darüber, wie man es in eine Server aufbauen .

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X