web-dev-qa-db-ja.com

Visual Studio web.configトランスフォームを使用してデバッグする

可能性のある複製:
組み込みのVisual StudioデバッガーサーバーでWeb.debug.configを使用するにはどうすればよいですか?

パブリッシュにもデバッグにも問題なく機能するWeb.config変換を使用したい。

Webアプリを公開すると、Visual Studioはcurrenctbuild構成に基づいてWeb.configを自動的に変換します。デバッグを開始するときにVisual Studioに同じことを行うにはどうすればよいですか?デバッグ開始時に、変換せずにデフォルトのWeb.configを使用するだけです。

何か案が?

152
Cutter

web.debug.configweb.release.configはパッケージ/公開専用であると理解して、OK。あなたがやろうとしていることを可能にする方法を思いつきました。 http://sedodream.com/2010/10/21/ASPNETWebProjectsWebdebugconfigWebreleaseconfig.aspx でブログを書いています。以下に要約を示します。

それでは、質問者が何をしたいのかを有効にする方法を見てみましょう。

要約すると、特定の構成に基づいて構築する場合、特定の変換をweb.configに適用する必要があります。したがって、web.configファイルは上書きされてしまうため、維持したくないのは明らかです。

したがって、必要なのは、web.template.configのコピーである新しいファイルweb.configを作成することです。次に、Windows Explorerを使用してweb.configを削除します(プロジェクトから削除したくないので、Visual Studioを使用して削除しないでください)。

注:Visual Studioに統合されているソース管理プロバイダーを使用している場合は、おそらくソース管理からweb.configを削除する必要があります。

また、これでweb.debug.configまたはweb.release.configを使用したくないのは、これらが既にWeb Publishing Pipelineで明確に定義された役割を持っているため、それを邪魔したくないからです。その代わりに、プロジェクトとweb.template.configweb.dev.debug.configおよびweb.dev.release.configという同じフォルダーに2つの新しいファイルを作成します。

アイデアは、これらがVisual Studioからアプリケーションをデバッグまたは実行するときに適用される変換になるということです。ここで、build/package/publishプロセスにフックして、これをすべて把握する必要があります。 Webアプリケーションプロジェクト(WAP)には、同じフォルダーに{ProjectName}.wpp.targetsという名前のプロジェクトファイルを作成できる拡張ポイントがあります。ここで、{ProjectName}はプロジェクトの名前です。このファイルがWAPと同じフォルダーのディスクにある場合、プロジェクトファイルに自動的にインポートされます。だから私はこのファイルを作成しました。そして、次のコンテンツを配置しました。

<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.Microsoft.com/developer/msbuild/2003">

  <!-- Make sure web.config will be there even for package/publish -->
  <Target Name="CopyWebTemplateConfig" BeforeTargets="Build">
    <Copy SourceFiles="web.template.config"
          DestinationFiles="web.config"/>
  </Target>

  <PropertyGroup>
    <PrepareForRunDependsOn>
      $(PrepareForRunDependsOn);
      UpdateWebConfigBeforeRun;
    </PrepareForRunDependsOn>
  </PropertyGroup>

  <!-- This target will run right before you run your app in Visual Studio -->
  <Target Name="UpdateWebConfigBeforeRun">
    <Message Text="Configuration: $(Configuration): web.dev.$(Configuration).config"/>
    <TransformXml Source="web.template.config"
              Transform="web.dev.$(Configuration).config"
              Destination="web.config" />
  </Target>

  <!-- Exclude the config template files from the created package -->
  <Target Name="ExcludeCustomConfigTransformFiles" BeforeTargets="ExcludeFilesFromPackage">
    <ItemGroup>
      <ExcludeFromPackageFiles Include="web.template.config;web.dev.*.config"/>
    </ItemGroup>
    <Message Text="ExcludeFromPackageFiles: @(ExcludeFromPackageFiles)" Importance="high"/>
  </Target>
</Project>

これについて少し説明させてください。 Visual Studioでアプリケーションをデバッグしていない場合でも、ビルド時に常にweb.template.configweb.configにコピーするCopyWebTemplateConfigターゲットを作成しました。

Visual Studioのパッケージ/発行プロセスを引き続きサポートする必要があるため、これが必要です。次に、プロパティPrepareForRunDependsOnを拡張してUpdateWebConfigBeforeRunターゲットを含めました。このプロパティは、Visual Studioからマネージプロジェクトを実行する前に実行する必要があるターゲットのリストを識別するために使用されます。

このターゲットでは、TransformXmlタスクを使用してweb.template.configを変換し、正しいweb.dev.***.configファイルを使用しています。その後、ビルド構成に基づいて正しいweb.configを使用してアプリが起動します。その後、別のターゲットExcludeCustomConfigTransformsFilesがあり、属性BeforeTargets=”ExcludeFilesFromPackage”を介してパッケージ/公開プロセスに注入します。アプリケーションがパッケージ化または公開されるときにこれらのファイルを含めたくないため、これが必要です。ですから、これですべてです。

このシナリオのパッケージ/公開プロセスをもう少し説明します。ビルド構成に応じて、web.debug.configまたはweb.release.configをパッケージ化/公開する場合も引き続き使用されます。ただし、最終的に変換するファイルはweb.template.configなので、そのファイルの内容に応じて調整する必要があります。質問/コメント?

92

アンドリューは正しい道を進んでいます。この機能を使用する場合、使用するように設計されています。

web.configこれは、開発者がローカルで使用する必要がある設定ファイルです。理想的には、これを標準化する必要があります。たとえば、DB文字列にlocalhostを使用できますが、そうではありません。これを変更せずに開発マシンで動作するように努力する必要があります。

web.debug.configこれは、アプリケーションを開発ステージング環境に公開するときに適用される変換です。これにより、ターゲット環境に必要なweb.configが変更されます。

web.release.configこれは、アプリケーションを「本番」環境に公開するときに適用される変換です。明らかに、アプリケーション/チームに応じてパスワードに注意する必要があります。

現在実行中のweb.configの変換に関する問題は、変換がweb.configに対して破壊的なアクションを実行できることです。たとえば、属性の削除、要素の削除などがあります。

34

開発/デバッグバージョンとして「デフォルト」のweb.configを使用するだけで、公開時にその変換が適用されるため、当然web.release.configはリリースバージョンのままです。

29
Andrew Barber

デバッグ構成で、ビルド後の手順を追加し、それを使用してweb.configを置き換え/変換します

18
Mitch Wheat

通常、最も単純なアプローチが最善であることに同意しますが、しばらくの間、IDEを開発データベースではなくテストデータベースに接続したい状況を簡単に想像できます。デフォルトのweb.configファイルで開発接続文字列を指定できますが、Web.Test.configファイルを用意しておくと、ビルド構成を「Test」にスワップしたときに自動的に新しい設定を取得できます。まだIDEにいる間に。

歴史的な選択肢は、接続文字列のセットを別の文字列にコメントアウトすることですが、これらの新しい構成変換は、そのいプラクティスの中心に最終的に出資するという希望を持ちませんでした。開発用のデフォルトファイルとリリース用のトランスフォームの1つがほとんどの場合に機能する可能性がありますが、web.configファイルをトランスフォームするためのビルド後の手順を追加することが私の意見ではより完全な答えです。

13
Metaphor