Visual Studio 2010 Webベースのアプリケーションには、異なる環境に合わせて複数の構成ファイルを管理できる構成変換機能があります。しかし、同じ機能は、Windowsサービス/ WinFormまたはコンソールアプリケーション用のApp.Configファイルには使用できません。
ここで示唆されているように利用可能な回避策があります: App.Config にXDTマジックを適用する。
しかしながら、それは直接的ではなく、そして多くのステップを必要とする。 app.configファイルで同じことを簡単に行う方法はありますか?
これは、この記事で扱う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>
私はいくつかの解決策を試してみましたが、これが私が個人的に見つけた最も簡単なものです。
Dan は、 元の投稿をコメントで指摘しました は Oleg Sych - に属しています、ありがとう、Oleg!
手順は次のとおりです。
1。各構成用のXMLファイルをプロジェクトに追加します。
通常Debug
とRelease
の設定があるので、あなたのファイルの名前をApp.Debug.config
とApp.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>
私が見つけたもう一つの解決策は、変換を使うのではなく、ただ別の設定ファイルを用意することです。 app.Release.config次に、この行をcsprojファイルに追加してください。
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|x86' ">
<AppConfig>App.Release.config</AppConfig>
</PropertyGroup>
これにより、正しいmyprogram.exe.configファイルが生成されるだけでなく、Visual Studioでセットアップと展開プロジェクトを使用してMSIを生成している場合は、パッケージ化時に展開プロジェクトで正しい設定ファイルが使用されます。
私の経験では、環境固有のものにする必要があるのは、接続文字列、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)で機能します。
この質問の Oleg と他の人に触発されて、私は解決策を取りました https://stackoverflow.com/a/ 5109530/2286801 以下を有効にするためのステップ.
この解決策は、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" />
完了しました。
設定ごとに別々の設定ファイルを使用することができます。 app.Debug.config、app.Release.configを選択してから、プロジェクトファイルの構成変数を使用します。
<PropertyGroup>
<AppConfig>App.$(Configuration).config</AppConfig>
</PropertyGroup>
これにより、構築している構成に応じて正しいProjectName.exe.configファイルが作成されます。
Webアプリケーションプロジェクトに組み込まれているもののようにapp.config変換を自動化するためのNice拡張を書きました 設定変換
この拡張の最大の利点は、すべてのビルドマシンにインストールする必要がないということです。
それで、私は少し異なるアプローチをとることになりました。私はステップ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>
私はこのツールでこの問題を解決しています http://ctt.codeplex.com/ 。私はパッケージを作るためにCCNet/nAntスクリプトでそれを使います。
今どこにでも投稿されているように思われるソリューションのほんの少しの改良:
<UsingTask TaskName="TransformXml" AssemblyFile="$(MSBuildExtensionsPath)\Microsoft\VisualStudio\v$(VisualStudioVersion)\Web\Microsoft.Web.Publishing.Tasks.dll" />
MarketplaceからVisual Studioに "Configuration Transform Tool"をインストールし、VSを再起動します。 app.configのメニュープレビュー変換も表示されます。
https://marketplace.visualstudio.com/items?itemName=GolanAvraham.ConfigurationTransform
ビルドアクションをコンテンツに変更するという要件が削除され、基本的にも実装されているVishal Joshiによって投稿されたものに代わるものをもう1つ作成しましたClickOnce配置のサポート。私は徹底的にそれをテストしなかったので私が基本的に言う、しかしそれは典型的なClickOnce配備シナリオでうまくいくはずです。
このソリューションは、既存のWindowsアプリケーションプロジェクト(* .csproj)にインポートされた単一のMSBuildプロジェクトで構成され、app.configの変換を検討するようにビルドプロセスを拡張します。
詳細な説明は Visual Studio App.config XML変換 で読むことができ、MSBuildプロジェクトファイルは でダウンロードできます。 GitHubから 。
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オンライン(クラウド)サーバーで機能します。
設定ファイルを含むクラスライブラリが別のプロジェクトから参照されている場合、提案されたソリューションは機能しません(私の場合はAzureワーカープロジェクトライブラリでした)。正しい変換済みファイルをobj
フォルダーからbin\##configuration-name##
フォルダーにコピーすることはありません。最小限の変更で動作するようにするには、AfterCompile
targetをBeforeCompile
に変更する必要があります。
<Target Name="BeforeCompile" Condition="exists('app.$(Configuration).config')">