Visual StudioのWebプロジェクトではないプロジェクトのApp.Config変革?
-
25-09-2019 - |
質問
Visual Studio 2010 Webベースのアプリケーションには、さまざまな環境に複数の構成ファイルを維持できる構成変換機能があります。ただし、Windowsサービス/WinFormsまたはコンソールアプリケーション用のapp.configファイルでも同じ機能は使用できません。
ここで提案されているように、利用可能な回避策があります: XDTマジックをapp.configに適用します.
ただし、簡単ではなく、多くのステップが必要です。 app.configファイルで同じことを達成する簡単な方法はありますか?
解決
これは、この記事で扱われているVisual Studio Addinで機能します。 slowcheetah -web.config変換構文はxml構成ファイルに一般化されるようになりました.
web.configを右クリックして、[構成変換の追加]をクリックします。これを行うと、web.debug.configとweb.release.configを取得します。名前が構成プロファイルと並んでいる限り、必要に応じてweb.hapitever.configを作成できます。これらのファイルは、Web.configの完全なコピーではなく、作成した変更にすぎません。
XSLTを使用してweb.configを変換したいと思うかもしれませんが、直感的に正しいと感じていますが、実際には非常に冗長です。
2つの変換があります。1つはXSLTを使用し、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>
他のヒント
私はいくつかの解決策を試しましたが、ここに私が個人的に見つけた最も簡単なものがあります。
ダン コメントで指摘した 元の投稿 属する オレグ・サイチ—ありがとう、オレグ!
ここに指示があります:
1.各構成のXMLファイルをプロジェクトに追加します。
通常、あなたは持っています Debug
と Release
構成がファイルに名前を付ける App.Debug.config
と App.Release.config
. 。私のプロジェクトでは、各種類の環境の構成を作成したので、それを試してみることをお勧めします。
2.プロジェクトをアンロードし、編集用の.csprojファイルを開きます
Visual Studioを使用すると、編集できます .csproj エディターのファイル - 最初にプロジェクトをアンロードする必要があります。次に、右クリックして選択します 編集u003CProjectName>.csproj.
3.アプリをバインドします。*。メインapp.configへの構成ファイル
すべてを含むプロジェクトファイルセクションを見つけます App.config
と App.*.config
参照。彼らのビルドアクションが設定されていることに気付くでしょう None
:
<None Include="App.config" />
<None Include="App.Debug.config" />
<None Include="App.Release.config" />
まず、それらすべてのビルドアクションをに設定します Content
.
次に、すべてを作ります 構成固有 ファイル 依存 メイン App.config
したがって、ビジュアルスタジオは、デザイナーやコードビハインドファイルのようにそれらをグループ化します。
上の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
変換!
ご参考までに
あなたを確認してください App.*.config
ファイルには、このような適切なセットアップがあります。
<?xml version="1.0" encoding="utf-8"?>
<configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform">
<!--magic transformations here-->
</configuration>
私が見つけたもう1つのソリューションは、変換を使用するのではなく、たとえばApp.Release.Configなどの構成ファイルを別のものにすることです。次に、この行をcsprojファイルに追加します。
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|x86' ">
<AppConfig>App.Release.config</AppConfig>
</PropertyGroup>
これにより、適切なmyprogram.exe.configファイルが生成されるだけでなく、Visual Studioでセットアップおよび展開プロジェクトを使用してMSIを生成する場合、展開プロジェクトにパッケージング時に正しい構成ファイルを使用させます。
私の経験では、環境固有のものを作るために必要なことは、接続文字列、控えめ、しばしばSMPT設定などです。構成システムにより、これらのものを別々のファイルで指定できます。したがって、これをapp.config/web.configで使用できます。
<appSettings configSource="appsettings.config" />
<connectionStrings configSource="connection.config" />
<system.net>
<mailSettings>
<smtp configSource="smtp.config"/>
</mailSettings>
</system.net>
私が通常することは、これらの構成固有のセクションを別々のファイルに、ConfigFilesと呼ばれるサブフォルダー(ソリューションルートまたはプロジェクトレベルのいずれか)に配置することです。構成ごとのファイルを定義します。
次に、次のようなビルド前イベントを定義できます。
copy $(ProjectDir)ConfigFiles\smtp.config.$(ConfigurationName) $(TargetDir)smtp.config
チーム開発では、コンベンションに%ComputerName%および/または%username%を含めることにより、これをさらに微調整できます。
もちろん、これは、ターゲットファイル(x.config)をソース制御に入れてはならないことを意味します(生成されるため)。引き続きプロジェクトファイルに追加し、出力タイプのプロパティを「常にコピー」または「新しい場合はコピー」に設定する必要があります。
シンプルで拡張可能であり、あらゆるタイプのビジュアルスタジオプロジェクト(コンソール、Winforms、WPF、Web)で機能します。
に触発された オレグ この質問では、解決策を取りました https://stackoverflow.com/a/5109530/2286801 次のことを可能にするためのさらにステップ。
- ClickOnceで動作します
- 2010年VSでセットアップおよび展開プロジェクトで動作します
- 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を編集できます。最初にプロジェクトをアンロードするだけです。次に、それを右クリックして、.csprojの編集を選択します。
3.アプリをバインドします。*。メインapp.configへの構成ファイル
すべてのapp.configとapp。*。参照を構成し、次のように置き換えるプロジェクトファイルセクションを見つけます。コンテンツの代わりに使用しないことに気付くでしょう。
<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ファイルが作成されます。
私は、app.config変換を自動化するための素晴らしい拡張機能を書きました。 構成変換
この拡張機能の最大の利点は、すべてのビルドマシンにインストールする必要がないことです
それで、私は少し異なるアプローチをとることになりました。ステップ3でダンの手順に従いましたが、別のファイルを追加しました:app.base.config。このファイルには、生成されたすべてのapp.configで必要な構成設定が含まれています。次に、beforebuild(yuriがtransformxmlに追加した)を使用して、現在の構成をbase構成でapp.configに変換します。ビルドプロセスは、通常のように変換されたapp.configを使用します。ただし、1つの迷惑は、その後、絶えず変化するapp.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>
市場からのビジュアルスタジオに「構成変換ツール」をインストールし、再起動対。 app.configのメニュープレビュー変換も表示できます。
https://marketplace.visualstudio.com/items?itemname=golanavraham.configurationTransform
このツールでこの問題を解決します http://ctt.codeplex.com/. 。パッケージを作成するためにCCNET/NANTスクリプトで使用します。
現在どこにでも投稿されていると思われるソリューションのほんの少しの改善:
<UsingTask TaskName="TransformXml" AssemblyFile="$(MSBuildExtensionsPath)\Microsoft\VisualStudio\v$(VisualStudioVersion)\Web\Microsoft.Web.Publishing.Tasks.dll" />
- つまり、現在のvsバージョンに永遠に滞在する予定がない限り
私はヴィシャル・ジョシによって投稿されたものの別の代替手段を作成しました。 コンテンツ 削除され、ClickOnce展開の基本的なサポートも実装されています。私はそれを徹底的にテストしなかったので、基本的なと言いますが、典型的なClickOnce展開シナリオで動作するはずです。
ソリューションは、既存のWindowsアプリケーションプロジェクト(*.csproj)にインポートされた単一のMSBuildプロジェクトで構成されており、ビルドプロセスを拡張してapp.config変換を熟考します。
より詳細な説明を読むことができます Visual Studio App.Config XML変換 そして、MSBUILDプロジェクトファイルはそうすることができます Githubからダウンロード.
TFSオンライン(クラウドバージョン)を使用し、プロジェクトでapp.configを変換する場合は、追加のツールをインストールせずに以下を実行できます。 vs =>> unload the project => edit project file =>ファイルの下部に移動して、次を追加します。
<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および宛先は、ローカル使用およびTFS Online(Cloud)サーバーのために機能します。
提案されたソリューションは、構成ファイルを備えたクラスライブラリが別のプロジェクトから参照されている場合に機能しません(私の場合、Azure Workerプロジェクトライブラリでした)。正しい変換されたファイルからコピーしません obj
フォルダーに bin\##configuration-name##
フォルダ。最小限の変更で動作させるには、変更する必要があります AfterCompile
ターゲット BeforeCompile
:
<Target Name="BeforeCompile" Condition="exists('app.$(Configuration).config')">