web-dev-qa-db-ja.com

App.Config Visual StudioのWebプロジェクトではないプロジェクト用の変換?

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

ここで示唆されているように利用可能な回避策があります: App.Config にXDTマジックを適用する。

しかしながら、それは直接的ではなく、そして多くのステップを必要とする。 app.configファイルで同じことを簡単に行う方法はありますか?

510
Amitabh

これは、この記事で扱うVisual Studioアドインでも機能します。 SlowCheetah - Web.config変換構文は、すべてのXML設定ファイル に対して一般化されました。

Web.configを右クリックして[Add Config Transforms]をクリックします。これを行うと、web.debug.configとweb.release.configが得られます。あなたが好きならweb.whatever.configを作ることができます、その名前が設定プロファイルと並ぶ限り。これらのファイルは単にあなたが加えたい変更であり、あなたのweb.configの完全なコピーではありません。

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

これは2つの変換です。1つはXSLTを使用し、もう1つはXML文書変換構文/名前空間を使用します。すべてのことと同様に、これを行うには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>
403
Scott Hanselman

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

手順は次のとおりです。

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

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

2。プロジェクトをアンロードし、編集用に.csprojファイルを開きます

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

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

すべてのApp.configおよびApp.*.config参照を含むプロジェクトファイルセクションを見つけます。ビルドアクションがNoneに設定されているのがわかります。

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

まず、それらすべてのビルドアクションをContentに設定します。
次に、すべての構成固有のファイルをメインのApp.config上に dependent で作成して、Visual Studioでデザイナーとコードのようにグループ化します。後ろのファイル。

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

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

4。変換マジックを起動する

後のファイルの終わりに

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

そして決勝戦の前に

</Project>

次のXMLを挿入してください。

  <UsingTask TaskName="TransformXml" AssemblyFile="$(MSBuildExtensionsPath)\Microsoft\VisualStudio\v$(VisualStudioVersion)\Web\Microsoft.Web.Publishing.Tasks.dll" />
  <Target Name="CoreCompile" Condition="exists('app.$(Configuration).config')">
    <!-- Generate transformed app config in the intermediate directory -->
    <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変換を楽しむことができます。

FYI

あなたのApp.*.configファイルがこのような正しいセットアップを持っていることを確認してください:

<?xml version="1.0" encoding="utf-8"?>
<configuration xmlns:xdt="http://schemas.Microsoft.com/XML-Document-Transform">
     <!--magic transformations here-->
</configuration>
527
Dan Abramov

私が見つけたもう一つの解決策は、変換を使うのではなく、ただ別の設定ファイルを用意することです。 app.Release.config次に、この行をcsprojファイルに追加してください。

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

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

127
Alec

私の経験では、環境固有のものにする必要があるのは、接続文字列、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)で機能します。

33
jeroenh

この質問の Oleg と他の人に触発されて、私は解決策を取りました https://stackoverflow.com/a/ 5109530/2286801 以下を有効にするためのステップ.

  • ClickOnceと連携します
  • VS 2010のセットアッププロジェクトと展開プロジェクトで機能します。
  • VS2010、2013、2015で動作します(2012年はテストされませんでしたが、同様に動作するはずです)。
  • チームビルドと連携します。 (A)Visual StudioまたはB)Microsoft.Web.Publishing.targetsおよびMicrosoft.Web.Publishing.Tasks.dllをインストールする必要があります。)

この解決策は、app.configがMSBuildプロセスで初めて参照される前にapp.config変換を実行することによって機能します。複数のプロジェクトにわたる管理を容易にするために外部ターゲットファイルを使用します。

説明書

他の解決策と同様のステップ。私は同じままにしているものを引用して、完全性とより簡単な比較のためにそれを含めました。

0 AppConfigTransformation.targetsという新しいファイルをプロジェクトに追加します

<Project xmlns="http://schemas.Microsoft.com/developer/msbuild/2003">
  <!-- Transform the app config per project configuration.-->
  <PropertyGroup>
    <!-- This ensures compatibility across multiple versions of Visual Studio when using a solution file.
         However, when using MSBuild directly you may need to override this property to 11.0 or 12.0 
         accordingly as part of the MSBuild script, ie /p:VisualStudioVersion=11.0;
         See http://blogs.msdn.com/b/webdev/archive/2012/08/22/visual-studio-project-compatability-and-visualstudioversion.aspx -->
    <VisualStudioVersion Condition="'$(VisualStudioVersion)' == ''">10.0</VisualStudioVersion>
  </PropertyGroup>

  <Import Project="$(MSBuildExtensionsPath)\Microsoft\VisualStudio\v$(VisualStudioVersion)\Web\Microsoft.Web.Publishing.targets" />

  <Target Name="SetTransformAppConfigDestination" BeforeTargets="PrepareForBuild" 
          Condition="exists('app.$(Configuration).config')">
    <PropertyGroup>
      <!-- Force build process to use the transformed configuration file from now on. -->
      <AppConfig>$(IntermediateOutputPath)$(TargetFileName).config</AppConfig>
    </PropertyGroup>
    <Message Text="AppConfig transformation destination: = $(AppConfig)" />
  </Target>

  <!-- Transform the app.config after the prepare for build completes. -->
  <Target Name="TransformAppConfig" AfterTargets="PrepareForBuild" Condition="exists('app.$(Configuration).config')">
    <!-- Generate transformed app config in the intermediate directory -->
    <TransformXml Source="app.config" Destination="$(AppConfig)" Transform="app.$(Configuration).config" />
  </Target>

</Project>

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

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

2。プロジェクトをアンロードし、編集のために.csprojファイルを開く

Visual Studioでは、エディタで.csprojを直接編集できます。まずプロジェクトをアンロードするだけです。次にそれを右クリックして[Edit .csproj]を選択します。

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

すべてのApp.configおよびApp。*。config参照を含むプロジェクトファイルセクションを見つけて、次のように置き換えます。 Contentの代わりにNoneを使用していることに気付くでしょう。

<ItemGroup>
  <None Include="app.config"/>
  <None Include="app.Production.config">
    <DependentUpon>app.config</DependentUpon>
  </None>
  <None Include="app.QA.config">
    <DependentUpon>app.config</DependentUpon>
  </None>
  <None Include="app.Development.config">
    <DependentUpon>app.config</DependentUpon>
  </None>
</ItemGroup>

4。変形魔法を有効にする

後のファイルの終わりに

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

そして決勝戦の前に

</Project>

次のXMLを挿入してください。

<Import Project="AppConfigTransformation.targets" />

完了しました。

28
bdeem

設定ごとに別々の設定ファイルを使用することができます。 app.Debug.config、app.Release.configを選択してから、プロジェクトファイルの構成変数を使用します。

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

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

27
Tevin

Webアプリケーションプロジェクトに組み込まれているもののようにapp.config変換を自動化するためのNice拡張を書きました 設定変換

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

13
Golan Avraham

それで、私は少し異なるアプローチをとることになりました。私はステップ3までDanのステップをたどりましたが、別のファイルを追加しました:App.Base.Config。このファイルには、生成されたApp.Configごとに必要な設定が含まれています。それから、BeforeBuildを使って(YuriがTransformXmlに追加したものを使って)現在の設定をBase設定でApp.configに変換します。その後、ビルドプロセスは変換されたApp.configを通常どおりに使用します。しかし、1つ厄介なのは、その後も常に変化するApp.configをソース管理から除外したいということですが、他のconfigファイルはそれに依存しています。

  <UsingTask TaskName="TransformXml" AssemblyFile="$(MSBuildExtensionsPath)\Microsoft\VisualStudio\v$(VisualStudioVersion)\Web\Microsoft.Web.Publishing.Tasks.dll" />
  <Target Name="BeforeBuild" Condition="exists('app.$(Configuration).config')">
    <TransformXml Source="App.Base.config" Transform="App.$(Configuration).config" Destination="App.config" />
  </Target>
4
Waggles

私はこのツールでこの問題を解決しています http://ctt.codeplex.com/ 。私はパッケージを作るためにCCNet/nAntスクリプトでそれを使います。

3
outcoldman

今どこにでも投稿されているように思われるソリューションのほんの少しの改良:

<UsingTask TaskName="TransformXml" AssemblyFile="$(MSBuildExtensionsPath)\Microsoft\VisualStudio\v$(VisualStudioVersion)\Web\Microsoft.Web.Publishing.Tasks.dll" />
  • つまり、現在のVSバージョンを永遠に使い続けるつもりがない限りです。
3
Yuri Makassiouk

MarketplaceからVisual Studioに "Configuration Transform Tool"をインストールし、VSを再起動します。 app.configのメニュープレビュー変換も表示されます。

https://marketplace.visualstudio.com/items?itemName=GolanAvraham.ConfigurationTransform

3
Agnel Amodia

ビルドアクションをコンテンツに変更するという要件が削除され、基本的にも実装されているVishal Joshiによって投稿されたものに代わるものをもう1つ作成しましたClickOnce配置のサポート。私は徹底的にそれをテストしなかったので私が基本的に言う、しかしそれは典型的なClickOnce配備シナリオでうまくいくはずです。

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

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

2
João Angelo

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オンライン(クラウド)サーバーで機能します。

1
Benjamin

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

<Target Name="BeforeCompile" Condition="exists('app.$(Configuration).config')">
0
avs099