環境間のweb.config設定の違いを処理するための良いヒントはありますか?ソース制御システム内でWeb階層の外側に「config」フォルダーを作成し、デプロイメントプロセスに適切な構成ファイル(web.dev.config、web.staging.config、web.production.config)をコピーさせることを検討しました。 )展開時にWebフォルダーに。また、アプリの起動時に構成設定(WCFエンドポイント、接続文字列など)をプログラムで変更する方法に関する投稿も確認しました。
ここでベストプラクティスと見なされるものは何ですか?また、これらのアプローチまたは他のアプローチで誰もがどのような経験をしましたか?
2010年9月の更新
Visual Studio 2010がこの機能を web.config transforms を介して追加していることは注目に値します。ビルド構成マネージャー(ビルド|構成マネージャー...)を使用してプロジェクトのさまざまな構成(デバッグ、開発、ステージング、リリースなど)を作成すると、VSはweb。*。configファイルをソリューションに追加します。デフォルトのweb.configには、デバッグに使用するベースライン設定が含まれています。 web.release.config、web.staging.configなどには、アクティブなビルド構成に基づいてプロジェクトを公開するたびに適用されるXSLT変換が含まれています。
新しいVSでは、Web構成変換を使用できます。
詳細はこちら: http://msdn.Microsoft.com/en-us/library/dd465326.aspx
私のアプローチは、複数の構成ファイルを持つことでした。私はすべての環境にとらわれないもの(つまり、開発、ステージング、本番のいずれでも構いません)をweb.configファイルに入れました。環境に固有のすべて(つまり、データベース接続情報、ロギング、デバッグ設定など)環境に固有のlocal.configファイルに入れました。次に、configSource( http://weblogs.asp.net/fmarguerie/archive/2007/04/26/using-configsource-to-split-configuration)を使用して、local.config設定をweb.configに含めることができます。 -files.aspx )
その後、Web.configをソース管理にチェックインできます。 local.configファイルをチェックインしないでください。これにより、デプロイスクリプトに正しいファイルをデプロイする必要があります。
私はCruiseControl.NET/NAntを使用していますが、NAntにはXMLPokeタスクがあり、XPathクエリを使用して構成設定を構築および変更するときにアクセスできます。
そのため、各ビルドターゲット(DEV、UAT、STAGINGなど)で一連のプロパティを設定してから、マスタービルドターゲットを呼び出します。マスタービルドターゲットはすべてのプロパティの値を取得し、それらを構成にXMLPokesしてビルドします。
私が見て使用した方法の1つは、web.config内でキーを設定して、コンピューターを名前で区別する方法です。
たとえば、次のようになります。
<add key="comp1.Environment" value="DEV"/>
<add key="compdb1.Environment" value="PROD"/>
<add key="compstage.Environment" value="STAGE"/>
明らかに、comp1、compdb1は実際のコンピューター名です。
次に、次のように設定します。
<add key="KeyName,DEV" value="DevEnvironmentValue"/>
コードでは、アプリケーションが実行されている環境を確認してから、適切なキーを取得する必要があります。
private string GetKeyValue() {
string machineName = String.Concat(System.Environment.MachineName, ".Environment");
string environment = ConfigurationManager.AppSettings[machineName];
string key = String.Concat("KeyName", ",", environment);
string keyValue = ConfigurationManager.AppSettings[key];
return keyValue;
}
Web Deployment project という名前のプロジェクトタイプがあります。これはMicrosoftから無料で入手でき、まさにそれを実行できます。ソリューションの構成(デバッグ、リリースなど)に応じて、web.configのセクションを置き換えることができます。これは1年以上使用されており、正常に機能します。 VS2005およびVS2008で使用できます。
これが役立つことを願っています
VS2012の展開環境に合わせてカスタマイズできるさまざまな構成を追加する方法は次のとおりです。
この後、TEST環境に固有のいくつかの変換を使用してweb.TEST.configを変更する必要があります
他の答えのいくつかがより適切かもしれませんが、私はそれを追加します Matt Bersethは彼自身の方法をロールバックしました 2007年に戻って...
要約すると、彼は環境間で異なるすべての値を独自のテキストファイルに保持し、ビルドプロセス中にカスタムツールを使用して値を.configファイルにマージします。
その投稿へのコメントで、Doron Yaacobyもコメントしています:
"MSBuild Community Tasksには、これ(およびそれ以上)を実現できるXmlMassUpdateというタスクがあります。 ブログに書いています "
環境にインストールする必要があります。ビルドする必要はありません。現実の世界では、QAでテストされたものを製品にインストールする必要があり、再構築は許可されていません。少なくとも私の世界ではそうです。
Easy way to have that is having an Enumeration , then having a switch statement based on the server name ( if its stable name ) .
Call GetURIPath() where ever you require to fetch details , here I given the examples for url's used
public class StaticData
{
public enum enumEnvironment
{
envNONE = 0,
envLOC = 1,
envDEV = 2,
envTEST = 3,
envPROD = 4
}
private static enumEnvironment GetCurrentEnv()
{
if (ConfigurationManager.GetSection("DBSettingsGroup/DBSettings") == null && ConfigurationManager.GetSection("DBSettings") == null)
{
return enumEnvironment.envLOC;
}
else
{
NameValueCollection NVCollection = new NameValueCollection();
NVCollection = (NameValueCollection)ConfigurationManager.GetSection("DBSettingsGroup/DBSettings");
if(NVCollection == null)
{
NVCollection = (NameValueCollection)ConfigurationManager.GetSection("DBSettings");
}
string sEnv = NVCollection.GetValues("serverrole").ToString();
switch (sEnv.ToUpper())
{
case "DEV-ISOLATED":
return enumEnvironment.envDEV;
case "DEVELOPMENT":
return enumEnvironment.envDEV;
case "TEST":
return enumEnvironment.envTEST;
case "PRODUCTION":
return enumEnvironment.envPROD;
default:
return enumEnvironment.envNONE;
}
}
}
public static string GetURIPath()
{
switch (GetCurrentEnv())
{
case enumEnvironment.envPROD:
return "http://produrl/yourapp/api/";
case enumEnvironment.envTEST:
return "http://testurl/yourapp/api/";
case enumEnvironment.envDEV:
return "http://devurl/yourapp/api/";
default:
return "http://localhost/yourapp/api/";
}
}
}