Wie kann ich Web.debug.config auf dem integrierten Visual Studio-Debugger-Server verwenden?

80

Wie kann ich den Web.debug.configin Visual Studio 2010 integrierten Debugger zusammenführen und verwenden?

Stapler
quelle

Antworten:

92

Dies ist ein bekannter Fehler. Diese Funktion kann derzeit nur als Teil des Bereitstellungsprozesses verwendet werden.

https://connect.microsoft.com/VisualStudio/feedback/details/523221/have-web-debug-config-apply-during-development

Bitte stimmen Sie dem zu, wenn Sie auch darauf stoßen, damit dies so schnell wie möglich behoben wird.

Stapler
quelle
16
Für die Aufzeichnung ist dies kein Fehler, es ist beabsichtigt. Diese Dateien sind für Paket / Veröffentlichung. Dies sollte jedoch niemanden davon abhalten, den Punkt abzustimmen.
Sagte Ibrahim Hashimi
26
Nun, für mich ist es ein Fehler, sonst was ist der Zweck einer Debug / Release-Transformation auf einem lokalen Server? Manchmal sind Designs falsch, das heißt nicht, dass es richtig ist :)
Lord of Scripts
4
Das Problem tritt auf, wenn Sie Github verwenden und die Datei web.config bei der Synchronisierung ignorieren müssen. Aber das macht den Zweck einer Sicherung zunichte - ich meine, deshalb benutze ich Github. Fügen Sie nun AppHarbor zum Szenario hinzu, und Sie müssen zwei Arten von web.config-Dateien unterstützen, da Ihre Apikeys auf Github veröffentlicht werden sollen. Daher müssen Sie vor dem Synchronisieren und Veröffentlichen Werte in Ihren Konfigurationen ersetzen. Es ist ein Problem. Vergessen Sie, Ihre Werte in der Konfiguration zu ersetzen und versehentlich zu synchronisieren, und wissen Sie was? Ihre Apikeys wurden gerade zu einem öffentlichen Repository. Huch, was für ein Problem.
David Robbins
8
Die Verbindung zu MS Connect ist unterbrochen
Michael Freidgeim
17
@LordofScripts: Wenn ein Fehler "wie geplant" geschlossen wird, möchte ich manchmal sagen "dann gibt es einen Fehler in Ihrem Design!"
Roy Tinker
34

Dies ist eigentlich recht einfach und, ob Sie es glauben oder nicht, es scheint, dass VS so funktioniert.

Fügen Sie die folgenden Zeilen wörtlich direkt vor dem schließenden "Project" -Tag der .csproj-Datei des Projekts hinzu, das web.config enthält.

<UsingTask TaskName="TransformXml" AssemblyFile="$(MSBuildExtensionsPath)\Microsoft\VisualStudio\v$(VisualStudioVersion)\Web\Microsoft.Web.Publishing.Tasks.dll" />
<Target Name="Transform">
    <MakeDir Directories="obj\$(Configuration)" Condition="!Exists('obj\$(Configuration)')" />
    <TransformXml Source="Web.Config" Transform="Web.$(Configuration).config" Destination="obj\$(Configuration)\Web.config" StackTrace="true" />
</Target>

Fügen Sie die folgenden Zeilen wörtlich in das Post-Build-Ereignis in den Projekteigenschaften des Projekts ein, das die Datei web.config enthält. Führen Sie dies für jede Build-Konfiguration aus, für die die Transformationen ausgeführt werden sollen.

"$(MSBUILDBINPATH)\msbuild" "$(ProjectPath)" /t:Transform /p:Configuration=$(ConfigurationName);Platform=AnyCPU
xcopy "$(ProjectDir)obj\$(ConfigurationName)\Web.Config" "$(ProjectDir)". /F /R /Y
steckte fest
quelle
1
Ich würde nur empfehlen, doppelte Anführungszeichen um $ (ProjectDir) und $ (ProjectPath) hinzuzufügen, um Fehler zu vermeiden, falls Ihr Projektpfad Leerzeichen enthält.
Alexander Prokofyev
1
Es ist besser, <Target Name = "BeforeBuild"> zu verwenden, wie es in stackoverflow.com/a/10506476/52277
Michael
Ich kann die Transformationen mit diesem Ansatz zum Laufen bringen, aber ich kann meine Haltepunkte nicht erreichen. Ich habe das Debug auf true gesetzt, aber ich habe den Haltepunkt nie erreicht und die folgende Meldung wird angezeigt: "Der Haltepunkt wird derzeit nicht erreicht. Für dieses Dokument wurden keine Symbole geladen." Dies geschieht nur für meine benutzerdefinierten Konfigurationen und funktioniert einwandfrei, wenn ich meine Konfiguration auf "Debug" setze. Irgendwelche Ideen?
mithun_daa
1
Ich musste doppelte Anführungszeichen um $ (MSBUILDBINPATH) hinzufügen , damit es funktioniert, sonst wird es beendet mit Code 9009
SOTN
6
Beachten Sie, dass dies das Original ersetzt Web.config, sodass alle Ihre Transformationen "idempotent" sein müssen (kann erneut auf die Ergebnisse aller anderen Transformationen angewendet werden ). Es wird Sie auch daran hindern, Ihre geistige Gesundheit zu bewahren, wenn Sie die Datei in die Quellcodeverwaltung stellen (wie Sie es wahrscheinlich sollten). Insgesamt ein "einfacher" Hack, der die Komplexität / den Schmerz auf die nächsten Probleme verlagert. Gut, wenn Sie es dort "besser" angehen können, schlecht, wenn Sie es nicht tun. Erwägen Sie auch, $ (VisualStudioVersion) zu verwenden, anstatt die VS-Version fest zu codieren (Sie werden vergessen, sie zu ändern).
Der
16

Ich hatte dies auf einfachere Weise gelöst, indem ich dies am Ende der .csproj-Datei direkt vor dem Tag hinzufügte. Dies ähnelt der Antwort von Keitn, mit dem Unterschied, dass kein Post-Build-Ereignis verwendet wird.

<Target Name="BeforeBuild">
    <TransformXml Source="Web.config" Transform="Web.$(Configuration).config" Destination="Web.config" />
</Target>
Marius Ologesa
quelle
3
Bestätigt, es funktioniert. Aber seien Sie vorsichtig, es ändert die lokale Kopie der Web.config. Wenn Sie also XSLT-Transformationen wie RemoveAttributes verwenden, wird diese definitiv entfernt! Funktioniert gut mit SetAttributes
Loul G.
Dies tat genau das, wonach ich suchte. Einfach und direkt auf den Punkt. Ich bin mir nicht sicher, warum alle anderen Lösungen so ... komplex sein müssen.
David Carrigan
Weiß jemand, wie man diese Aktion im Abschnitt <Target name = "AfterBuild"> rückgängig macht?
Cameron Belt
1
Dies sollte die Antwort sein.
Cameron Belt
2

Ich wollte die web.config in meinem Projekt nicht aktualisieren, sondern nur die, die im bin-Ordner landet. Hier ist, wie ich es gemacht habe.

Fügen Sie am Ende von .csproj Folgendes hinzu (kurz vor dem endgültigen abschließenden Projekt-Tag)

<Target Name="Transform">
    <MakeDir Directories="bin" Condition="!Exists('bin')" />
    <TransformXml Source="Web.Config" Transform="Web.$(Configuration).config" Destination="bin\$(TargetFileName).config" StackTrace="true" />
  </Target>

Fügen Sie dann den folgenden Post-Build-Schritt hinzu

"$(MSBUILDBINPATH)\msbuild" "$(ProjectPath)" /t:Transform /p:Configuration=$(ConfigurationName);Platform=AnyCPU

Dies bedeutet, dass beim Erstellen einer Transformation von der Debug- / Release-Konfiguration in die Datei WebsiteName.Config im Ausgabe-Bin-Verzeichnis die Haupt-web.config im Projekt nicht beeinträchtigt wird.

keitn
quelle
2
Dadurch wird die Konfiguration im bin-Verzeichnis transformiert. Leider wird diese Konfiguration nie verwendet. Die geladene Konfiguration ist eigentlich die Web.Config im Projektordner, nicht die im bin-Verzeichnis.
Mick
2

Nachdem ich viele ähnliche Beiträge gelesen hatte und Probleme mit Dateien hatte, die nicht überschrieben werden konnten oder auf die web.config nicht zugegriffen werden konnte, weil sie nur gelesen wurde, arbeitete ich für mich:

  <Target Name="BeforeBuild" Condition="$(Configuration) == 'MyAltDebugConfiguration'">
    <ItemGroup>
      <OriginalWebConfig Include="$(ProjectDir)Web.config"/>
      <TempWebConfig Include="$(ProjectDir)TempWeb.config"/>
    </ItemGroup>
    <Exec Command="&quot;$(DevEnvDir)tf.exe&quot; checkout &quot;$(ProjectDir)Web.config&quot;" />
    <Copy SourceFiles="@(OriginalWebConfig)" DestinationFiles="@(TempWebConfig)" />
    <TransformXml Source="$(ProjectDir)TempWeb.config"
                            Transform="Web.$(Configuration).config"
                            Destination="Web.config" />
  </Target>

Anmerkungen:

Dies wird als BeforeBuild-Ziel ausgeführt.

Ich möchte nur, dass es unter einer bestimmten Konfiguration (einer alternativen Debug-Umgebung) ausgeführt wird, und deshalb habe ich die Bedingung. Bei der Bereitstellung über das Web wird das Veröffentlichungsziel aktiviert, und dieses Ziel muss nicht ausgeführt werden.

Ich möchte nicht daran denken müssen, web.config auszuchecken (nur um es rückgängig zu machen, wenn ich fertig bin), also checke ich web.config aus, bevor ich mit der Transformation beginne. Wenn Sie kein TFS verwenden, können Sie diese Zeile entfernen.

Da VS (2010) \ msbuild die Quelle web.config nicht loslassen möchte, verwende ich eine temporäre Datei (dank dieses Artikels für die Info: http://www.diaryofaninja.com/blog/2011/09/ 14 / using-custom-webconfig-transformations-in-msbuild )

Ich habe versucht, einen Befehl zum Löschen der Datei TempWeb.config hinzuzufügen, aber VS \ msbuild möchte ihn nicht loslassen. Ich kann damit leben, da es nicht zu TFS hinzugefügt wird.

Mike Cheel
quelle
Ich habe diesen Fehler The command ""C:\Program Files (x86)\Microsoft Visual Studio\2019\Professional\Common7\IDE\tf.exe" checkout "C:\_Code\RTS\SCTimeSheet\Web.config"" exited with code 9009. Irgendwelche Ideen?
sky91
1

Ich weiß, dass dies alt ist, aber ich stehe vor dem gleichen Problem. Wir haben Test-, Staging- und Live-Konfigurationen, die Endpunkte, Verbindungszeichenfolgen usw. aus der Standard-Web.config ersetzen

Ich würde jedoch Folgendes tun:

  • Klicken Sie mit der rechten Maustaste auf die gewünschte Transformationskonfiguration (z. B. Web.Live.config ).
  • Klicken Sie auf "Preview Transform"
  • Kopieren Sie alles von rechts (so sieht die Web.config mit der Transformation aus)
    • STRG + A + STRG + C.
  • Öffnen Sie die Datei Web.config (Standard)
  • Wählen Sie alles aus (STRG + A) und fügen Sie es ein (STRG + V).
  • Lauf

Es sind nicht so viele Schritte und es ist ziemlich schnell erledigt, wenn Sie es verstehen. Hoffe das hilft. :) :)

Gaui
quelle
Wenn ich richtig verstanden habe, ist dies eine destruktive Änderung an der ursprünglichen Datei web.config. Im Kontext der Frage müssten diese Schritte jedes Mal ausgeführt werden, wenn eine Debug-Sitzung gestartet wird.
Red Taz
-1

@ologesa: Ihre Lösung benötigt Schreibzugriff auf die ursprüngliche Web.config (Sie müssen in TFS auschecken). Die bessere Lösung besteht darin, die Datei Web.config direkt im Ordner bin zu generieren, wie dies keitn tut. Wenn wir Keitns und Ihre Lösung kombinieren, erhalten wir diese:

<Target Name="BeforeBuild">
    <Message Text="Transforming Web.config from Web.$(Configuration).config" Importance="high" />
    <MakeDir Directories="bin" Condition="!Exists('bin')" />
    <TransformXml Source="Web.Config" Transform="Web.$(Configuration).config" Destination="bin\$(TargetFileName).config" StackTrace="true" />
</Target>
Mickey Maus
quelle
3
Wäre schön, aber wie Mick kommentierte; Diese Datei wird nicht verwendet. Wie bekomme ich die Anwendung oder IIS, um diese Konfigurationsdatei zu verwenden?
HMR