web-dev-qa-db-ja.com

Visual Studioでカスタム構成ファイルの構成変換を追加する方法は?

私が取り組んでいるプロジェクトでは、構成ファイルから多くのサービスエンドポイント(url)を読み取ります。リストは非常に大きいため、web.configをクリーンで小さく保つために、カスタム構成ファイルに保存することにしました。以下のように、カスタムセクションをWebに含めました。

<mySection configSource="myConfig.config" />

私は完璧に動作します。

ただし、プロジェクトをさまざまな環境に展開する際に、変換の問題が発生します。 3つのweb.configファイルがあります。

Web.config

Web.Uat.config

Web.Release.config

変換web.configは機能しますが、デプロイ時にカスタム構成ファイルの変換は失敗します。

展開中にカスタム構成ファイルを変換する方法はありますか?

20
TejSoft

Visual Studioは、デフォルトでweb.configファイルのみを変換します。

DEV、UAT、PRODなどの環境用に変換されたカスタム構成ファイルが必要な場合は、

  1. SlowCheetah-XML Transforms のようなVisual Studioのカスタム拡張機能を構成変換プレビュー機能に使用します。
  2. Nuget SlowCheetah からプロジェクトに追加して、ビルドイン変換を提供します。

少し詳細:

拡張機能と更新プログラムからVS拡張機能SlowCheetahを追加します Screen of Extensions and Updates

myconfig.configを右クリックして、transormの追加を選択します: Screen of Extensions and Updates

定義された各構成内に、次のような独自の変換ルールを挿入します。

<services xmlns:xdt="http://schemas.Microsoft.com/XML-Document-Transform">
  <service name="WebApplication1.Services.Service2" xdt:Transform="Replace" xdt:Locator="Match(name)" >
    <endpoint address="http://localhost:57939/Services/DebugService" behaviorConfiguration="WebApplication1.Services.Service2AspNetAjaxBehavior"
      binding="webHttpBinding" contract="WebApplication1.Services.Service2" />
  </service>
</services>

お役に立てば幸いです

18
Michael

Andoni Ripoll Jarautaの答えをもう少し詳しく説明します。

同様の問題に直面しました。マージの競合を制限するために、web.configファイルから接続文字列を引き出したいと思いました。また、公開時に静的情報を含む「リリース」設定を作成したかったのです。

...簡単です。カスタム構成ファイルwebdb.configを作成し、web.configファイルを更新します。

例web.config

<connectionStrings configSource="WebDB.config"/>

wedbdb.config(変換にはxml version = "1.0"が必要です)

<?xml version="1.0" encoding="utf-8"?>
<connectionStrings>
</connectionStrings>

次に、webdb.configの変換ファイルを追加します

enter image description here

WebDB.Debug.configの例:

<?xml version="1.0" encoding="utf-8"?>

<connectionStrings xdt:Transform="Replace" xmlns:xdt="http://schemas.Microsoft.com/XML-Document-Transform">
    <add name="PRRADDataContainer" connectionString="metadata=~/PRRADData.csdl|~/PRRADData.ssdl|~/PRRADData.msl;provider=System.Data.SqlClient;provider connection string=';Data Source=localhost;Initial Catalog=;User ID=;Password=;multipleactiveresultsets=True;App=EntityFramework';" providerName="System.Data.EntityClient" />
    <add name="MyConnectionString" connectionString="Data Source=localhost;Initial Catalog=;Persist Security Info=True;User ID=;Password=;" providerName="System.Data.SqlClient" />
</connectionStrings>

WebDB.Release.configの例:

<?xml version="1.0" encoding="utf-8"?>

<connectionStrings xdt:Transform="Replace" xmlns:xdt="http://schemas.Microsoft.com/XML-Document-Transform">
    <add name="PRRADDataContainer" connectionString="metadata=~/PRRADData.csdl|~/PRRADData.ssdl|~/PRRADData.msl;provider=System.Data.SqlClient;provider connection string=';Data Source=prod_server;Initial Catalog=;User ID=;Password=;multipleactiveresultsets=True;App=EntityFramework';" providerName="System.Data.EntityClient" />
    <add name="MyConnectionString" connectionString="Data Source=prod_server;Initial Catalog=;Persist Security Info=True;User ID=;Password=;" providerName="System.Data.SqlClient" />
</connectionStrings>

次に、ビルド後イベントを追加する必要があります。これは、CSPROJファイルを編集するだけで作成されます。

<UsingTask TaskName="TransformXml" AssemblyFile="$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)\Web\Microsoft.Web.Publishing.Tasks.dll" />
<Target Name="AfterBuild">
    <TransformXml Source="WebDB.config" Transform="WebDB.$(Configuration).config" Destination="WebDB.config" />
</Target>

ローカルで実行すると、WebDB.Debug.configが取得され、コードを公開するときに、構成ソースとして[リリース]を選択するだけです。どちらの場合も、WebDB.configファイルはビルド時に対応するファイルで更新されます。

注:webdb.config、webdb.debug.config、およびwebdb.release.configを[出力ディレクトリにコピー]オプションの[コピーしない]に設定してください。

お役に立てれば!

5
spyder1329

私はSlowCheetahを使用していますが、もっとエレガントだと思うものを見つけました。ビルド構成に応じて.configを生成するようにビルドに指示するだけです。

プロジェクトにapp.Release.configがある(または展開のニーズに応じてさらに多くの)場合、プロジェクトファイル(C#でプログラムする場合は.csprojファイル)を編集するだけです。最後の</ItemGroup></Project>の間で終わりを見つけて追加します:

  </ItemGroup>
  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
  <UsingTask TaskName="TransformXml" AssemblyFile="$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)\Web\Microsoft.Web.Publishing.Tasks.dll" />
  <Target Name="AfterBuild">
    <PropertyGroup>
      <OutputTypeName>$(OutputType)</OutputTypeName>
      <OutputTypeName Condition="'$(OutputTypeName)'=='Library'">dll</OutputTypeName>
      <OutputTypeName Condition="'$(OutputTypeName)'=='Module'">dll</OutputTypeName>
      <OutputTypeName Condition="'$(OutputTypeName)'=='Winexe'">exe</OutputTypeName>
    </PropertyGroup>
    <TransformXml Source="Config\app.config" Transform="Config\app.$(Configuration).config" Destination="$(OutputPath)\$(AssemblyName).$(OutputTypeName).config" />
  </Target>
</Project>

VisualStudioから保存して再読み込みします。リリースモードでコンパイルし、変換が行われた<MyProject>.configファイルのbin/Releaseフォルダーを確認します。

この投稿ヘルプ

拡張機能のインストールを必要としないビルドイベントを使用しない別のアプローチがあります。

次のようなカスタム設定があるとします:

  • myConfig.config
  • myConfig.Uat.config
  • myConfig.Release.config

次に、メインWeb.configに次のものがあります。

<mySection configSource="myConfig.config" />

最後に、Web.Uat.config内に次のような変換を追加します。

<mySection configSource="myConfig.Uat.config" xdt:Transform="SetAttributes" />

これはmyConfig.configファイルを変換するのではなく、使用するカスタム構成ファイルの名前を上書きするものです。 Releaseおよびその他の環境でも同じことができます。

myConfig.Uat.configには変換を含めないでください。これは、カスタム環境に適切な値を持つ基本カスタム構成ファイルのコピーである必要があります。

欠点は、ベースカスタム構成ファイルに何かを追加するたびに、他のenvの構成ファイルにも追加する必要があることです(envsで値が同じであっても)。そのため、環境間で変更する必要がある設定にこれらのカスタム構成ファイルを使用することを検討します。

0
Alisson