2010-08-06 2 views
6

In dem Team, in dem ich arbeite, haben wir ein großes Produkt mit vielen WCF-Webdiensten und einigen Websites, die die Dienste nutzen. Wir sind gerade im Begriff, auf VS 2010 zu aktualisieren, und ich schaue, ob wir anfangen sollten, die neuen Konfigurations-Transformationsfunktionen in VS 2010 zu verwenden.Wie wird die Visual Studio 2010-Konfigurationsumwandlung beim lokalen Ausführen/Debuggen verwendet?

Wir haben mehrere verschiedene Umgebungen, die verschiedene web.configs benötigen (Datenbankverbindungszeichenfolgen, WCF Adressen usw.). Oft ist es beim Debuggen von etwas hochaktuellem wie dem Web-Frontend nützlich, es so zu konfigurieren, dass es direkt mit dem TEST- oder QA-Backend/den Datenbanken in Verbindung tritt. Auf dem lokalen Rechner jedes Entwicklers wird der IIS direkt auf den Quellordner jedes WCF/Web-Projekts konfiguriert, und bei der lokalen Ausführung ist es eine einfache Angelegenheit von Strg-Umschalt-B oder F5, um etwas zu debuggen. Man würde denken, dass es möglich wäre,/F5 mit TEST oder QA als Konfigurationsmodus aufzubauen und die TEST/QA-Konfiguration zu bekommen, aber ich sehe nicht wie. Wird es nicht unterstützt, oder müssen wir vielleicht ändern, wie wir mit Dingen arbeiten?

Unsere andere Möglichkeit besteht darin, stattdessen ein einfaches Ersetzenskript als Prebuild-Ereignis zu verwenden, das web.config je nach Konfigurationsmodus aus einer Vorlage und einer Schlüsseldatei erstellt. Mit dieser Methode würden Sie TEST-Konfiguration erhalten, wenn Sie in TEST usw. kompilieren, aber es fühlt sich ein wenig schlecht an, unsere eigene Lösung zu rollen, wenn eine Funktion in Visual Studio integriert ist.

Antwort

1

Sie können den gewünschten Effekt erzielen, indem Sie die Targets BeforeBuild und AfterBuild in der Datei .csproj verwenden. Die VS.NET-IDE führt diese Ziele beim Erstellen oder Neuaufbau aus, sodass Sie sie zum Ausführen der web.config-Transformationen verwenden können. Da Sie eine web.config-Transformation durchführen müssen und die tatsächliche web.config-Datei überschreiben müssen, müssen Sie sich auf eine neue Datei mit dem Namen web.default.config verlassen, um die Basisdaten von web.config zu speichern.

Ich habe versucht, dies in einem Testprojekt herausstellte, waren hier die Änderungen, die ich an die CSPROJ Datei vorgenommen:

<Import Project="$(MSBuildExtensionsPath)\MSBuildCommunityTasks\MSBuild.Community.Tasks.Targets" /> 
<ProjectExtensions> 
... 
</ProjectExtensions> 
<Target Name="BeforeBuild"> 
    <Copy SourceFiles="$(ProjectDir)web.default.config" DestinationFiles="$(ProjectDir)web.config" /> 
</Target> 
<Target Name="AfterBuild" Condition="$(FirstRun) != 'false'"> 
    <MSBuild Projects="$(MSBuildProjectFile)" Targets="TransformWebConfig" Properties="FirstRun=false;" /> 
    <Sleep Milliseconds="2000" /> 
    <Copy SourceFiles="$(ProjectDir)obj\$(ConfigurationName)\TransformWebConfig\transformed\web.config" 
     DestinationFiles="$(ProjectDir)web.config" /> 
</Target> 

ich diese an die CSPROJ Datei manuell hinzufügen musste (I verwendet Notepad ++). Soweit ich das beurteilen kann, gibt es keine Möglichkeit, diese Anweisungen über die VS.NET IDE hinzuzufügen. Sie müssen die Bedingung für das AfterBuild bereitstellen, um keine Zirkelreferenz zu verwenden, da der Aufruf von MSBuild den Build erneut ausführt, um die web.config-Transformation zu generieren.

Im Grunde kopieren wir die Datei web.default.config (unsere Basisvorlage) über die vorhandene web.config, bevor wir mit dem Erstellen beginnen, und dann verwenden wir MSBuild, um eine web.config für jede Konfiguration zu generieren wir bauen. Nachdem die Transformation abgeschlossen ist, verwenden wir einen Copy-Task, um die transformierte Datei zu übernehmen und in die Datei web.config im Webstamm zu kopieren. Ein Problem, auf das ich gelegentlich stieß, war ein Fehler bei der Verwendung einer Datei, wenn versucht wurde, web.config zu überschreiben, nachdem die Umwandlung abgeschlossen war. Hinzufügen einer Schlafaufgabe (von MSBuildCommunityTasks) nach der MSBuild-Task hat dieses Problem behoben.

Ich habe nur diesen Ansatz mit dem integrierten ASP.NET-Server, nicht IIS getestet, so YMMV, aber ich fühle mich wie dies eine praktikable Lösung ist.

Die FirstRun-Idee kam von dieser post.

+0

Ive markiert diese Antwort als akzeptiert, da es scheint, als ob es das Problem löst (auch wenn ich es nicht getestet habe). Vielen Dank. Am Ende gingen wir mit einem benutzerdefinierten Postbuild-Event, wie ich es im letzten Absatz geschrieben habe, ein kleines Powershell-Skript, das web.config aus einer Vorlage erstellt, die den Konfigurationsnamen verwendet, um zu entscheiden, wie ersetzt werden soll. – viblo

+0

@ viblo Danke. Ich bin mir nicht sicher, ob ich den Ansatz verwenden würde, den ich skizziert habe, da es eine Art von Haschisch ist, aber ich war mehr neugierig darauf, ob es getan werden könnte oder nicht. Wie auch immer, gute Frage. – rsbarro

+0

@rsbarro zuerst einmal vielen Dank für Ihre saubere Antwort. Allerdings habe ich immer noch das gleiche Problem "Datei in Verwendung Fehler".Auch ich habe hinzugefügt. Hast du einen anderen Vorschlag? Danke – curiousBoy

Verwandte Themen