web-dev-qa-db-fra.com

Comment puis-je utiliser Web.debug.config dans le serveur de débogage Visual Studio intégré?

Comment puis-je fusionner et utiliser Web.debug.config dans le débogueur intégré de Visual Studio 2010?

75
stacker

C'est un bug connu. Cette fonctionnalité ne peut être utilisée pour le moment que dans le cadre du processus de déploiement.

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

S'il vous plaît, votez-le, si vous le rencontrez également, ce sera corrigé dès que possible.

92
stacker

C'est en fait assez simple à faire et, croyez-le ou non, il semble que c'est ainsi que VS est conçu pour fonctionner.

Ajoutez les lignes suivantes textuellement juste avant la balise de fermeture "Project" du fichier .csproj du projet qui contient web.config.

<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>

Mettez les lignes suivantes textuellement à l'événement post-génération dans les propriétés de projet du projet qui contient le fichier web.config. Effectuez cette opération pour chaque configuration de build pour laquelle vous souhaitez exécuter les transformations.

"$(MSBUILDBINPATH)\msbuild" "$(ProjectPath)" /t:Transform /p:Configuration=$(ConfigurationName);Platform=AnyCPU
xcopy "$(ProjectDir)obj\$(ConfigurationName)\Web.Config" "$(ProjectDir)". /F /R /Y
34
stuckintheshuck

J'avais résolu cela d'une manière plus simple, en l'ajoutant à la fin du fichier .csproj, juste avant la balise. Ceci est similaire à la réponse de keitn, à la différence près qu'il n'utilise pas d'événement post-build.

<Target Name="BeforeBuild">
    <TransformXml Source="Web.config" Transform="Web.$(Configuration).config" Destination="Web.config" />
</Target>
15
ologesa

Après avoir lu de nombreux articles similaires et rencontré des problèmes avec les fichiers ne pouvant pas être écrasés ou web.config n'étant pas accessible car il est en lecture seule, voici ce que j'ai obtenu pour moi:

  <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>

Remarques:

Cela fonctionne comme la cible BeforeBuild.

Je veux seulement qu'il fonctionne sous une certaine configuration (un environnement de débogage alternatif) et c'est pourquoi j'ai la condition. Lors du déploiement via le Web, la cible de publication entre en jeu et je n'ai pas besoin de cette cible pour exécuter.

Je ne veux pas avoir à me souvenir de vérifier web.config (uniquement pour l'annuler lorsque j'ai terminé), je vérifie donc web.config avant de commencer la transformation. Si vous n'utilisez pas TFS, vous pouvez supprimer cette ligne.

Parce que VS (2010)\msbuild ne veut pas lâcher le Web.config source j'utilise un fichier temporaire (merci à cet article pour l'info: http://www.diaryofaninja.com/blog/ 2011/09/14/using-custom-webconfig-transformations-in-msbuild )

J'ai essayé d'ajouter une commande pour supprimer TempWeb.config mais VS\msbuild ne veut pas le lâcher. Je peux vivre avec car il n'est pas ajouté à TFS.

2
Mike Cheel

Je ne voulais pas mettre à jour le web.config dans mon projet juste celui qui finit dans le dossier bin alors voici comment je l'ai fait.

Ajoutez ce qui suit à la fin de .csproj (juste avant la balise de projet de fermeture finale)

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

Ensuite, ajoutez l'étape de post-construction suivante

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

Cela signifie que lorsque vous générez une transformation à partir de la configuration de débogage/libération vers le fichier WebsiteName.Config dans le répertoire bin de sortie, cela n'interfère donc pas avec le web.config principal dans le projet.

2
keitn

Je sais que c'est vieux, mais je suis confronté au même problème. Nous avons des configurations de test, de transfert, en direct qui remplacent les points de terminaison, les chaînes de connexion, etc. à partir du Web.config par défaut

Cependant, je ferais ce qui suit:

  • Faites un clic droit sur la configuration de transformation souhaitée (par exemple Web.Live.config)
  • Cliquez sur "Aperçu de la transformation"
  • Copiez tout de droite (c'est à quoi ressemble Web.config avec la transformation)
    • CTRL + A + CTRL + C
  • Ouvrir le fichier Web.config (par défaut)
  • Sélectionnez tout (CTRL + A) et collez-le (CTRL + V)
  • Courir

Ce n'est pas beaucoup d'étapes et cela se fait assez rapidement lorsque vous vous en sortez. J'espère que cela t'aides. :)

1
Gaui