571

Visual Studio 2010 の Web ベース アプリケーションには、さまざまな環境用に複数の構成ファイルを維持できる構成変換機能があります。ただし、Windows サービス/WinForms またはコンソール アプリケーションの App.Config ファイルでは、同じ機能を使用できません。

ここで提案されている回避策があります: XDT マジックを App.Config に適用します

ただし、これは簡単ではなく、いくつかの手順が必要です。app.config ファイルで同じことを達成する簡単な方法はありますか?

4

15 に答える 15

618

私はいくつかの解決策を試しましたが、これが私が個人的に見つけた最も簡単なものです。
Danはコメントで、元の投稿Oleg Sychのものであると指摘しました—<strong>ありがとう、Oleg!

手順は次のとおりです。

1. 各構成の XML ファイルをプロジェクトに追加します。

通常Debug、 と の構成があるため、ファイルに とReleaseという名前を付けます。私のプロジェクトでは、環境の種類ごとに構成を作成したので、それを試してみることをお勧めします。App.Debug.configApp.Release.config

2. プロジェクトをアンロードし、.csproj ファイルを開いて編集する

Visual Studio では、.csprojファイルをエディターで直接編集できます。最初にプロジェクトをアンロードするだけで済みます。次に、それを右クリックしてEdit <ProjectName>.csprojを選択します。

3. App.*.config ファイルをメインの App.config にバインドします

すべてApp.configApp.*.config参照を含むプロジェクト ファイル セクションを見つけます。ビルド アクションが次のように設定されていることに気付くでしょうNone

<None Include="App.config" />
<None Include="App.Debug.config" />
<None Include="App.Release.config" />

次に、すべての構成固有のファイルをメインに依存App.configさせ、 Visual Studio がデザイナー ファイルやコード ビハインド ファイルと同じようにグループ化するようにします。

上記の XML を以下のものに置き換えます。

<None Include="App.config" />
<None Include="App.Debug.config" >
  <DependentUpon>App.config</DependentUpon>
</None>
<None Include="App.Release.config" >
  <DependentUpon>App.config</DependentUpon>
</None>

4. 変換マジックを有効にします ( VS2019などの Visual Studio バージョンでは引き続き必要です) 。

後のファイルの最後に

<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />

そしてファイナル前

</Project>

次の XML を挿入します。適切な変換が行われるには 2 つの手順があることに注意してください。

  <UsingTask TaskName="TransformXml" AssemblyFile="$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)\Web\Microsoft.Web.Publishing.Tasks.dll" />
  <Target Name="BeforeBuild" Condition="Exists('App.$(Configuration).config')">
    <!-- Generate transformed app config and replace it: will get the <runtime> node and assembly bindings properly populated -->
    <TransformXml Source="App.config" Destination="App.config" Transform="App.$(Configuration).config" />
  </Target>
  <Target Name="AfterBuild" Condition="Exists('App.$(Configuration).config')">
    <!-- Generate transformed app config in the intermediate directory: this will transform sections such as appSettings -->
    <TransformXml Source="App.config" Destination="$(IntermediateOutputPath)$(TargetFileName).config" Transform="App.$(Configuration).config" />
    <!-- Force build process to use the transformed configuration file from now on.-->
    <ItemGroup>
      <AppConfigWithTargetPath Remove="App.config" />
      <AppConfigWithTargetPath Include="$(IntermediateOutputPath)$(TargetFileName).config">
        <TargetPath>$(TargetFileName).config</TargetPath>
      </AppConfigWithTargetPath>
    </ItemGroup>
  </Target>

App.configこれで、プロジェクトをリロードしてビルドし、変換を楽しむことができます!

ご参考までに

App.*.configファイルが次のように正しく設定されていることを確認してください。

<?xml version="1.0" encoding="utf-8"?>
<configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform">
     <!--magic transformations here-->
</configuration>
于 2011-02-24T19:36:27.873 に答える
421

これは、記事「SlowCheetah - Web.config Transformation Syntax now generalized for any XML configuration file 」で扱われている Visual Studio AddIn で機能するようになりました。

web.config を右クリックし、[構成変換の追加] をクリックします。これを行うと、web.debug.config と web.release.config が得られます。名前が構成プロファイルと一致している限り、必要に応じて web.whatever.config を作成できます。これらのファイルは、web.config の完全なコピーではなく、必要な変更のみです。

XSLT を使用して web.config を変換したいと思うかもしれませんが、直感的には正しいように思えますが、実際には非常に冗長です。

ここに 2 つの変換があります。1 つは XSLT を使用し、同じものは XML Document Transform 構文/名前空間を使用します。すべてのものと同様に、XSLT でこれを行う方法は複数ありますが、一般的な考え方はわかります。XSLT は一般化されたツリー変換言語ですが、この展開言語は一般的なシナリオの特定のサブセット向けに最適化されています。ただし、優れた点は、各 XDT 変換が .NET プラグインであるため、独自のものを作成できることです。

<?xml version="1.0" ?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:template match="@*|node()">
  <xsl:copy>           
    <xsl:apply-templates select="@*|node()"/>
  </xsl:copy>
</xsl:template>
<xsl:template match="/configuration/appSettings">
  <xsl:copy>
    <xsl:apply-templates select="node()|@*"/>
    <xsl:element name="add">
      <xsl:attribute name="key">NewSetting</xsl:attribute>
      <xsl:attribute name="value">New Setting Value</xsl:attribute>
    </xsl:element>
  </xsl:copy>
</xsl:template>
</xsl:stylesheet>

または、展開変換を介して同じこと:

<configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform">
   <appSettings>
      <add name="NewSetting" value="New Setting Value" xdt:Transform="Insert"/>
   </appSettings>
</configuration>
于 2011-08-25T18:15:22.723 に答える
143

私が見つけた別の解決策は、変換を使用せず、app.Release.config などの別の構成ファイルを使用することです。次に、この行を csproj ファイルに追加します。

  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|x86' ">
    <AppConfig>App.Release.config</AppConfig>
  </PropertyGroup>

これにより、適切な myprogram.exe.config ファイルが生成されるだけでなく、Visual Studio でセットアップおよび展開プロジェクトを使用して MSI を生成している場合、展開プロジェクトはパッケージ化時に正しい構成ファイルを使用するように強制されます。

于 2011-10-18T18:12:55.087 に答える
35

私の経験では、環境固有にする必要があるのは、接続文字列、appsettings、および多くの場合 smpt 設定などです。構成システムでは、これらを個別のファイルで指定できます。したがって、これを app.config/web.config で使用できます。

 <appSettings configSource="appsettings.config" />
 <connectionStrings configSource="connection.config" />
 <system.net>
    <mailSettings>
       <smtp configSource="smtp.config"/>
    </mailSettings>
 </system.net>

私が通常行うことは、これらの構成固有のセクションを、別のファイルの ConfigFiles という名前のサブフォルダー (ソリューション ルートまたはプロジェクト レベルのいずれかによって異なります) に配置することです。smtp.config.Debug や smtp.config.Release など、構成ごとにファイルを定義します。

次に、ビルド前のイベントを次のように定義できます。

copy $(ProjectDir)ConfigFiles\smtp.config.$(ConfigurationName) $(TargetDir)smtp.config

チーム開発では、規則に %COMPUTERNAME% や %USERNAME% を含めることで、これをさらに微調整できます。

もちろん、これは、ターゲット ファイル (x.config) をソース管理に入れるべきではないことを意味します (それらは生成されるため)。ただし、それらをプロジェクト ファイルに追加し、出力タイプ プロパティを「常にコピー」または「新しい場合はコピー」に設定する必要があります。

シンプルで拡張可能で、すべてのタイプの Visual Studio プロジェクト (コンソール、winform、wpf、web) で機能します。

于 2011-02-12T10:08:49.110 に答える
29

app.Debug.config、app.Release.configなど、構成ごとに個別の構成ファイルを使用してから、プロジェクトファイルで構成変数を使用できます。

<PropertyGroup>
    <AppConfig>App.$(Configuration).config</AppConfig>
</PropertyGroup>

これにより、構築している構成に応じて、正しいProjectName.exe.configファイルが作成されます。

于 2012-07-02T09:32:53.183 に答える
14

Web Application Project Configuration Transformに組み込まれているような app.config 変換を自動化するための優れた拡張機能を作成しました。

この拡張機能の最大の利点は、すべてのビルド マシンにインストールする必要がないことです。

于 2012-05-27T07:59:44.077 に答える
4

現在どこにでも投稿されているように見えるソリューションを少し改善しました。

<UsingTask TaskName="TransformXml" AssemblyFile="$(MSBuildExtensionsPath)\Microsoft\VisualStudio\v$(VisualStudioVersion)\Web\Microsoft.Web.Publishing.Tasks.dll" />
  • つまり、現在の VS バージョンを永久に使用する予定がない限り、
于 2013-08-06T08:34:53.290 に答える
2

ビルド アクションをContentに変更する要件が削除された Vishal Joshi によって投稿されたものに代わる別の方法を作成し、ClickOnce 配置の基本的なサポートも実装しました。完全にテストしていないため、ベーシックと言いましたが、典型的な ClickOnce 展開シナリオでは機能するはずです。

このソリューションは、既存の Windows アプリケーション プロジェクト (*.csproj) にインポートされた単一の MSBuild プロジェクトで構成され、ビルド プロセスを拡張して app.config 変換を検討します。

詳細な説明はVisual Studio App.config XML Transformationで読むことができ、MSBuild プロジェクト ファイルはGitHub からダウンロードできます。

于 2010-06-22T15:59:42.240 に答える
1

構成ファイルを含むクラス ライブラリが別のプロジェクト (私の場合は Azure ワーカー プロジェクト ライブラリ) から参照されている場合、提案されたソリューションは機能しません。obj正しい変換済みファイルをフォルダーからフォルダーにコピーしませんbin\##configuration-name##AfterCompile最小限の変更で動作させるには、ターゲットをBeforeCompile次のように変更する必要があります。

<Target Name="BeforeCompile" Condition="exists('app.$(Configuration).config')">
于 2016-10-06T18:57:37.083 に答える
1

TFS オンライン (クラウド版) を使用していて、プロジェクト内の App.Config を変換したい場合は、追加のツールをインストールせずに次のことができます。VSから=>プロジェクトをアンロード=>プロジェクトファイルを編集=>ファイルの最後に移動して、次を追加します。

<UsingTask TaskName="TransformXml" AssemblyFile="$(MSBuildExtensionsPath)\Microsoft\VisualStudio\v$(VisualStudioVersion)\Web\Microsoft.Web.Publishing.Tasks.dll" />
<Target Name="AfterBuild" Condition="Exists('App.$(Configuration).config')">
<TransformXml Source="App.config" Transform="App.$(Configuration).config" Destination="$(OutDir)\$(AssemblyName).dll.config" />

AssemblyFile と Destination は、ローカルでの使用と TFS オンライン (クラウド) サーバーで機能します。

于 2015-03-18T09:28:03.017 に答える