複数のビルド構成に異なるapp.configを選択する方法


115

私が持っているDLL型プロジェクト MSTestを統合テストが含まれています。私のマシンではテストに合格し、CIサーバーでも同じようにしたいと思っています(TeamCityを使用しています)。しかし、app.configの一部の設定を微調整する必要があるため、テストは失敗します。これが、CIサーバーの設定を保持する別の2番目のapp.configファイルがあると考えていた理由です。

だから私はしたいと思います

/ Sln
 / Proj
  app.config(これはVSで必要とされると思います)
  app.Release.config(これはスタンドアロンの独立した構成ファイルです)

したがって、CIのビルド構成でリリース構成を選択した場合、app.configではなくapp.Release.configファイルを使用したいと思います。

問題
これは、単純な.dllタイプのプロジェクトでは簡単ではないようです。Webプロジェクトの場合、Web構成の変換を行うことができます。DLLタイプのプロジェクトでこれらの変換を行う方法をハックで見つけましたが、私はハックの大ファンではありません。

質問
.NETプロジェクト(デバッグ、リリースなど)のビルド構成に応じてapp.configファイルを微調整する標準的なアプローチは何ですか?

回答:


154

SlowCheetahプラグインを使用します。SlowCheetahの使用方法の詳細と詳細については、読み続けてください。

既にお気づきのように、ライブラリタイプ(.dll)プロジェクトにさまざまな設定ファイルを使用するためのデフォルトの簡単な方法はありません。その理由は、現在の考え方は「あなたがする必要はない」ということです!フレームワーク開発者は、コンソール、デスクトップ、Web、モバイルアプリなど、実行可能ファイルの構成が必要だと考えています。DLLの構成を提供し始めると、構成の地獄と呼べるような結果になる可能性があります。なぜこれとその変数がどこからともなく一見奇妙な値を持っている理由が(簡単に)理解できなくなっているかもしれません。

「保留」-「統合/単体テストにはこれが必要ですが、、ライブラリです!」。そしてそれは真実であり、これはあなたができることです(1つだけ選んで、混ぜないでください):

1. SlowCheetah-現在の設定ファイルを変換します

SlowCheetah-すべての低レベルのXMLポーキング(または変換)を行うVisual Studioプラグインをインストールできます。それが機能する方法、簡単に:

  • SlowCheetahをインストールしてVisual Studioを再起動します(Visual Studio> Tools> Extensions and Updates ...> Online> Visual Studio Gallery> search for "Slow Cheetah")
  • ソリューション構成を定義します(デフォルトではデバッグリリースがあります)、さらに追加できます(ソリューションエクスプローラーソリューションを右クリック> 構成マネージャー... > アクティブソリューション構成 >新規...
  • 必要に応じて設定ファイルを追加します
  • 構成ファイルを右クリック> 変換を追加
    • これにより、変換ファイルが作成されます-構成ごとに1つ
    • 変換ファイルはインジェクター/ミューテーターとして機能し、必要なXMLコードを元の構成ファイルで見つけ、新しい行を挿入したり、必要な値を変更したりします。

2. .projファイルをいじる-まったく新しい設定ファイルをコピーして名前を変更する

もともとここから撮影。これは、Visual Studioの.projファイルに埋め込むことができるカスタムMSBuildタスクです。次のコードをコピーしてプロジェクトファイルに貼り付けます。

<Target Name="AfterBuild">
    <Delete Files="$(TargetDir)$(TargetFileName).config" />
    <Copy SourceFiles="$(ProjectDir)\Config\App.$(Configuration).config"
          DestinationFiles="$(TargetDir)$(TargetFileName).config" />
</Target>

次に、呼び出されたプロジェクトにフォルダーを作成し、Configそこに新しいファイルを追加します:App.Debug.configApp.Release.configなど。これで、構成に応じて、Visual StudioはConfigフォルダーから構成ファイルを選択し、それを出力ディレクトリにコピーして名前を変更します。したがって、PatternPA.Test.Integrationプロジェクトとデバッグ構成を選択した場合、ビルド後の出力フォルダーには、コピー元であり、後で名前が変更されたPatternPA.Test.Integration.dll.configファイルがありますConfig\App.Debug.config

これらは、設定ファイルに残すことができるいくつかのメモです

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

    <!-- This file is copied and renamed by the 'AfterBuild' MSBuild task -->

    <!-- Depending on the configuration the content of projectName.dll.config 
        is fully substituted by the correspondent to build configuration file 
        from the 'Config' directory. -->

</configuration>

Visual Studioでは、このようなものを持つことができます

プロジェクトの構造

3. Visual Studio外でスクリプトファイルを使用する

各ビルドツール(NAntMSBuildなど)は、構成に応じて構成ファイルを変換する機能を提供します。これは、ビルドマシンでソリューションをビルドする場合に役立ちます。ビルドマシンで、リリースのために製品を準備する方法と方法をより詳細に制御する必要があります。

たとえば、WebパブリッシングDLLのタスクを使用して、構成ファイルを変換できます

<UsingTask AssemblyFile="..\tools\build\Microsoft.Web.Publishing.Tasks.dll"
    TaskName="TransformXml"/>

<PropertyGroup>
    <!-- Path to input config file -->  
    <TransformInputFile>path to app.config</TransformInputFile>
    <!-- Path to the transformation file -->    
    <TransformFile>path to app.$(Configuration).config</TransformFile>
    <!-- Path to outptu web config file --> 
    <TransformOutputFile>path to output project.dll.config</TransformOutputFile>
</PropertyGroup>

<Target Name="transform">
    <TransformXml Source="$(TransformInputFile)"
                  Transform="$(TransformFile)"
                  Destination="$(TransformOutputFile)" />
</Target>

2番目のソリューションは正常に機能しますが、Webプロジェクトの公開には適していません。ASP.NETプロジェクトを公開した後、元のweb.configが公開されます。
Massood Khaari 2014年

3
@MassoodKhaariでは、このタスクが発行ターゲットに対して呼び出されるようにする必要があります。プロジェクトを公開すると、別のビルドターゲットが呼び出されますが、デフォルトのAfterBuildターゲットは呼び出されない場合があります。通常のコンパイルではAfterBuild、デフォルトでターゲットが呼び出されます。パブリッシュケースのクイックフィックスがあるはずです
oleksii 2014年

1
2番目の方法を使用しました(ちょっと)。プロジェクトのプロパティに行って、編集したBeforeBuildをコピーするApp.<Target>.configApp.config、プロジェクトのディレクトリではなく、出力ディレクトリ。
SparK 2014年

@oleksiiそうです。しかし、私のWebパブリッシュプロセスが使用しているターゲットがまだ見つかりませんでした(Visual Studio 2013)。
Massood Khaari 2014年

1
2番目の方法を使用していますが、削除前にファイルが実際に存在することを確認するために、AfterBuildターゲットに条件を追加する必要がありました。基本的にデフォルトのApp.configファイルを使用するデバッグビルド構成がありますが、App.Debug.configがなかったため、ビルドステップが失敗しました。追加しCondition="Exists('$(ProjectDir)App.$(Configuration).config')"たばかりです。
Siewers、2016

23

次のアプローチを試すことができます。

  1. ソリューションエクスプローラーでプロジェクトを右クリックし、[ プロジェクトのアンロード]を選択します。
  2. プロジェクトがアンロードされます。プロジェクトをもう一度右クリックし、[ <YourProjectName> .csprojの編集 ]を選択します
  3. これで、Visual Studio内でプロジェクトファイルを編集できます。
  4. * .csprojファイルで、アプリケーション構成ファイルが含まれている場所を見つけます。次のようになります。
    <ItemGroup>
        <なしInclude = "App.config" />
    </ ItemGroup>
  1. この行を次のように置き換えます。
    <ItemGroup Condition = "'$(Configuration)' == 'Debug'">
        <なしInclude = "App.Debug.config" />
    </ ItemGroup>

    <ItemGroup Condition = "'$(Configuration)' == 'Release'">
        <なしInclude = "App.Release.config" />
    </ ItemGroup>

私はこの方法でapp.configファイルを試したことはありませんが、Visual Studioプロジェクトの他の項目では問題なく機能しました。ビルドプロセスは、ほぼすべての方法でカスタマイズできます。とにかく、結果を教えてください。


答えはTnxですが、これはapp.configでは機能しません。VSは必須でapp.configあり、VSビルドまたはTeamcity VS slnビルドランナーを使用している場合、リリース構成は適用されません。
oleksii 2011年

2
ここでは、その方法を説明します。app.debug.config app.release.configを有効にします
Gabrielizalo

1
なぜこの回答には非常に多くの賛成票があるのですか?試してみましたが動作しません。実際、デバッグモードとリリースモードの両方にApp.configファイルがないため、出力フォルダーに対応するファイルがありません。App.Debug.configファイルとApp.Release.configファイルは、Visual Studioでは意味がありません。
MarkusParker 2017年

動作しません:.csprojを開くことができません。エラーメッセージ「ターゲットエレメントの外部のエレメントにはInclude、Update、またはRemoveが必要です」
Elo

12

ConfigGenを検討する必要があります。この目的のために開発されました。テンプレートファイルと設定ファイルに基づいて、各展開マシンの構成ファイルを生成します。これはあなたの質問に明確に答えるものではないことを知っていますが、あなたの問題にうまく答えるかもしれません。

したがって、デバッグ、リリースなどではなく、テスト、UAT、本番などを使用できます。開発者マシンごとに異なる設定を行うこともできるため、開発者マシンに固有の構成を生成し、他のデプロイメントに影響を与えることなく変更できます。 。

使用例は...

<Target Name="BeforeBuild">
    <Exec Command="C:\Tools\cfg -s $(ProjectDir)App.Config.Settings.xls -t       
        $(ProjectDir)App.config.template.xml -o $(SolutionDir)ConfigGen" />

    <Exec Command="C:\Tools\cfg -s $(ProjectDir)App.Config.Settings.xls -t
        $(ProjectDir)App.config.template.xml -l -n $(ProjectDir)App.config" />
</Target>

これを.csprojファイルに配置し、次のファイルがある場合...

$(ProjectDir)App.Config.Settings.xls

MachineName        ConfigFilePath   SQLServer        

default             App.config      DEVSQL005
Test                App.config      TESTSQL005
UAT                 App.config      UATSQL005
Production          App.config      PRODSQL005
YourLocalMachine    App.config      ./SQLEXPRESS


$(ProjectDir)App.config.template.xml 

<?xml version="1.0" encoding="utf-8" standalone="yes"?>
   <configuration>
   <appSettings>
       <add key="ConnectionString" value="Data Source=[%SQLServer%]; 
           Database=DatabaseName; Trusted_Connection=True"/>
   </appSettings>
</configuration>

...それが結果になります...

最初のコマンドから、xlsファイルで指定された各環境用に生成された構成ファイルは、出力ディレクトリ$(SolutionDir)ConfigGenに配置されます

.../solutiondir/ConfigGen/Production/App.config

<?xml version="1.0" encoding="utf-8" standalone="yes"?>
   <configuration>
   <appSettings>
       <add key="ConnectionString" value="Data Source=PRODSQL005; 
           Database=DatabaseName; Trusted_Connection=True"/>
   </appSettings>
</configuration>

2番目のコマンドから、開発マシンで使用されるローカルのApp.configは、ローカル(-l)スイッチとファイル名(-n)スイッチで指定された生成された構成に置き換えられます。


2
答えはTnx、これは悪くないようです。ただし、いくつかの欠点があり、ダウンロード数は75しか表示されないため(成熟していないため)、. xlsまたは.xlsxでのみ機能します。単純な操作のために、さらに別のカスタムドキュメント形式に依存したくありません。より標準的なアプローチを探していました...
oleksii

2
公平な点、CodePlexでのダウンロード数は194とありますが、xlsはスプレッドシートであり、ほとんどカスタム形式ではありません。また、これを使用することを承認した3つの主要な投資銀行を知っています。現在要求されている機能の1つは、設定にxmlを使用することです。ほぼ準備はできていますが、とにかくスプレッドシートのアプローチを好みます。すべての環境のすべての設定を表形式で表示する方がはるかに簡単です
Daniel Dyson

現在、xmlだけでなくプレーンテキストファイルの生成に使用できるconfigGenのバージョンのテストの最終段階にあります。したがって、環境固有のcss、sql、javascriptなどを生成したい場合は、configGenサイトに注目してください
Daniel Dyson

ダニエルの解決に感謝します。これはまさに私が探していたものです。やってみます。
Bhupinder Singh 2017

10

Romeoと同じアプローチを使用して、Visual Studio 2010に適合させました。

 <None Condition=" '$(Configuration)' == 'Debug' " Include="appDebug\App.config" />

 <None Condition=" '$(Configuration)' == 'Release' " Include="appRelease\App.config" />

ここでは、両方のApp.configファイルを異なるディレクトリ(appDebugおよびappRelease)に保持する必要があります。私はそれをテストし、それはうまくいきます!


3

構成ファイルの操作にXmlPreprocessツールを使用しています。複数の環境(または、複数のビルドターゲット)に対して1つのマッピングファイルを使用しています。Excelでマッピングファイルを編集できます。とても使いやすいです。


3

VisualStudio GalleryのSlowCheetahとFastKoalaは、この問題を解決する非常に優れたツールのようです。

ただし、アドインを回避するか、アドインがビルド/統合プロセス全体でより広範囲に実装する原則を使用する場合は、msbuild * projファイルにこれを追加することで簡単に修正できます。

注:これは、多かれ少なかれ、@ oleksiiの回答の2番目の書き直しです。

これは.exeおよび.dllプロジェクトで機能します。

  <Target Name="TransformOnBuild" BeforeTargets="PrepareForBuild">
    <TransformXml Source="App_Config\app.Base.config" Transform="App_Config\app.$(Configuration).config" Destination="app.config" />
  </Target>

これはWebプロジェクトで機能します。

  <Target Name="TransformOnBuild" BeforeTargets="PrepareForBuild">
    <TransformXml Source="App_Config\Web.Base.config" Transform="App_Config\Web.$(Configuration).config" Destination="Web.config" />
  </Target>

このステップは、適切なビルドが始まる前でも発生することに注意してください。構成ファイルの変換は、プロジェクトフォルダーで行われます。これにより、デバッグ時に変換されたweb.configを使用できるようになります(SlowCheetahの欠点)。

App_Configフォルダー(またはそれを呼び出すために選択したもの)を作成する場合は、さまざまな中間構成ファイルにビルドアクション=なし、および出力ディレクトリにコピー=コピーしないことを忘れないでください。

これにより、両方のオプションが1つのブロックに結合されます。条件に応じて適切なものが実行されます。ただし、TransformXmlタスクは最初に定義されます。

<Project>
<UsingTask TaskName="TransformXml" AssemblyFile="$(MSBuildExtensionsPath)\Microsoft\VisualStudio\v$(VisualStudioVersion)\Web\Microsoft.Web.Publishing.Tasks.dll" />
<Target Name="TransformOnBuild" BeforeTargets="PrepareForBuild">
    <TransformXml Condition="Exists('App_Config\app.Base.config')" Source="App_Config\app.Base.config" Transform="App_Config\app.$(Configuration).config" Destination="app.config" />
    <TransformXml Condition="Exists('App_Config\Web.Base.config')" Source="App_Config\Web.Base.config" Transform="App_Config\Web.$(Configuration).config" Destination="Web.config" />
</Target>


Visual Studio 2017でこれを試してみましたが、機能しません。シュート。実装するのが最も簡単に見えるので、それがうまくいくことを本当に望んでいました。
グレッグバーガート

TransformXmlタスクはサンプルでは定義されていません。エントリを追加しています。ソリューションのすべての起動プロジェクトに含まれるmycustom.targetsファイルで定義できます。
Eniola

@GregBurghardt、今すぐ試しますか?
Eniola

試してみるかもしれません。Visual Studio用のConfig Transformプラグインをインストールしましたが、それは本当にうまくいきました。私は実際にプラグインが基本的にあなたの答えがすることをするのだろうかと思います。
Greg Burghardt

はい、どうなるか教えてください。
Eniola

1

XDT(web.config)変換エンジンが役立つかどうかを確認します。現在、これはWebプロジェクトでネイティブにのみサポートされていますが、技術的には他の種類のアプリケーションでの使用を妨げるものはありません。プロジェクトファイルを手動で編集してXDTを使用する方法については多くのガイドがありますが、うまく機能するプラグインを見つけました:https ://visualstudiogallery.msdn.microsoft.com/579d3a78-3bdd-497c-bc21-aa6e6abbc859

プラグインは設定のセットアップを支援するだけであり、ビルドする必要はなく、ソリューションはプラグインや他のツールを必要とせずに他のマシンまたはビルドサーバーでビルドできます。


これが今の答えになるはずです。VS 2017で試してみただけで、魅力的に機能します。プロジェクトを公開する必要はありません。ビルドするだけです。継続的インテグレーションビルドで使用するテストプロジェクトに最適です。ヘッドレスモードでSeleniumテストを実行できますが、ローカルでブラウザーを開いたまま実行できます。できれば+1,000,000。
グレッグバーガート

1

私はここで見つけた解決策でこのトピックを解決しました:http : //www.blackwasp.co.uk/SwitchConfig.aspx

つまり、「ビルド後のイベントを追加することによって。[...]以下を追加する必要があります。

if "Debug"=="$(ConfigurationName)" goto :nocopy
del "$(TargetPath).config"
copy "$(ProjectDir)\Release.config" "$(TargetPath).config"
:nocopy

考え抜かれた人たちによって台無しにされた、非常にシンプルで不可欠な機能であるべきことを行うための最も簡単な方法!Janbroに感謝します。
BoiseBaked

1

私はSlowCheetahについて良いことを聞きましたが、それを機能させることができませんでした。私は次のことを行いました:特定の構成のそれぞれにamタグを追加します。

例:

<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'UAT|AnyCPU'">
    <OutputPath>bin\UAT\</OutputPath>
    <PlatformTarget>AnyCPU</PlatformTarget>
    <DebugType>pdbonly</DebugType>
    <Optimize>true</Optimize>
    <DefineConstants>TRACE</DefineConstants>
    <ErrorReport>prompt</ErrorReport>
    <WarningLevel>4</WarningLevel>
    <AppConfig>App.UAT.config</AppConfig>
  </PropertyGroup>

これは、ビルド構成ごとにapp.configファイルを変更する別の非常に単純な方法のようです。マイク、標準のデバッグおよびリリース構成でテストしましたか?
BoiseBaked

0

:開発のためのコンフィグ管理上のいくつかの研究の後やなどを構築し、私は自分自身をロールバックすることを決めた、私はでビットバケットに、それが利用可能になりましたhttps://bitbucket.org/brightertools/contemplate/wiki/Home

この複数の環境用の複数の構成ファイルは、テキストベースのファイル形式で機能する基本的な構成エントリ置換ツールです。

お役に立てれば。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.