t100のプログラミング脱出作戦

自分のプログラミング脳をプログラムにして、いつかプログラミングから脱出してやるぞっ!とか夢見ながら、日々プログラム作っていく 百野 貴博 の日記です!今は、屋号『百蔵。』として、Silverlight・WPFを追跡中です! (2007/09/30)
スポンサーサイト
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
【--/--/-- --:--】 | スポンサー広告 | トラックバック(-) | コメント(-) top↑
.NETの構成ファイルを開発と本番で切り替える
.NET アプリケーションを作っていると、構成ファイルを開発と本番で切り替えたくなることがあります。

ていうか。どんなアプリでもあるよ。
普通ある。
DB接続先もWebReferenceも切り替えたいやん。

それも手動じゃなく切り替わって欲しい。
開発環境と本番環境の設定を事前にしておいて、デプロイで自動で切り替わって欲しい。
Debug時は開発環境、Release時はリリース環境用の設定に自動的によ。

デプロイは、出来上がったプログラムをコピーすれば良いだけにしたいですやん。

リリース時に手作業が入ったらバグの元だもんね。
Javaだと、Antでグリグリデプロイスクリプトを組んでたんだけども、.net ではどうやるんだろうと思って調べてみました。


が、なかなかベストな解決策が見つからない・・・。

結局、構成ファイルの外部ファイル化+「ビルド後に実行するコマンドライン」で解決することにしました。

でも、この方法だと「開発」「リリース」の2つしか管理できないんだよなー。
「ステージング」も欲しいんですが、、、

うーむ。。。
とりあえず仕方ないか・・・

で、具体的に、どうやったかというと
以下の感じです。


1.構成ファイルを、本番用と開発用の2つ用意

App.config に加えて開発用に Local.config を用意します。
そして、App.config の appSettings に Local.config の読み込みの記述を追加します。
これで、ファイルがあれば読むし無ければ無視されます。
(読み込みエラーにならないのです)

<appSettings file="Local.config" >



2.ConnectionStringsは、本番用と開発用を App.configに書いとく。

ConnectionStringsは、App.config側にしか書けない為
本番用と開発用の両方の接続設定を記述します。

このとき、ConnectionStringsのキー名の末尾に、
本番用は ".RELEASE" を、開発用は".DEBUG" を付けるようにします。

例えばこんな感じです。

<connectionStrings>
<add name="DB1.DEBUG" connectionString="..." />
<add name="DB1.RELEASE" connectionString="..." />
</connectionStrings>


3.RunModeという設定値を構成ファイルに追加する。

appSettingsに、RunMode という設定値を追加します。

開発用の Local.config には以下を。

<appSettings>
<add key="RunMode" value="DEBUG" />
</appSettings>


本番用の App.config には以下を。

<appSettings>
<add key="RunMode" value="RELEASE" />
</appSettings>



何がしたいか、だんだん見えてきたでしょうか・・・。

4.アプリケーションからは、RunModeを接尾語にした名前で値を取得。

アプリケーションからConnectionStringを取得する場合、RunModeを接尾語にして
値を取得するようにします。


String runMode = ConfigurationManager.AppSettings["RunMode"];
ConfigurationManager.ConnectionStrings["DB1." + runMode];


こうすることで、Local.config ファイルがある場合は
DB1.DEBUG の接続文字列が読まれ、ファイルが無い場合(本番等)は
DB1.RELEASE の接続文字列が読まれるようになります。

リリース版にデバッグ環境の情報が含まれるのが、ちょっと嫌ではありますが、、、


5.ビルド後の設定で、Local.config は削除されるようにする。

プロジェクトプロパティの、ビルドイベントにある「ビルド後に実行するコマンドライン」で
以下のコマンドを指定します。

del Local.config

これにより、Releaseビルドには Local.config が含まれないようになります。



以上です。

うーむ。
微妙にイマイチなんだけども、とりあえずこれしか思いつきませんでした・・・。


ちなみに、WebReference(Web参照)のURLの切り替えは
今回の構成ファイルを別ける方法で、うまく出来るようになっています。

以下のURLの「動的 URL とユーザー構成ファイルの使用方法」を見ると
わかるのですが、Web参照は構成ファイルの appSetting から
自動的にURLを取得する仕組みが組み込まれているようです。

http://www.microsoft.com/japan/msdn/net/bda/tdlg_ch4.aspx

ですので、この仕組みがそのまま使えます。



プリプロセッサでビルドを別けるという方法も考えたのですが
リリース前に、プリプロセッサオプションを変える手作業が発生する点と
リリース後に、どういうオプションでビルドされたのか確認する方法が無い点が
気になって諦めてしましました。

プリプロセッサは、あくまでもデバッグコードを本番に含めないという利用が
無難かもしれません。



ちょっと尻切れですが、以上です・・・。
眠い・・・。

誰か、もっとスマートな方法があったら教えてください・・・。













管理者にだけ表示を許可する


トラックバックURL:
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。