あるクライアントの場合、QA と本番環境で使用するビルドを提供する必要があります。ビルド ファイルのチェックサムは一致する必要があります。QA と本番の間で変更することはできません。各環境の構成は異なるため、コードのみを含むビルドと、環境固有の構成ファイルのみを含む環境ごとの個別のビルドがあります。構成ファイルのビルドは、環境に関係なく同じ場所にファイルを配置するため、コードはその環境の設定を含む c:\myapp\myconfig.xml を常にロードできます。これについて私が読んだほとんどの記事 ( Scott Hanselman の記事など)) 環境ごとに異なるビルドが含まれますが、チェックサム値が異なるため、これは機能しません。これらの構成ファイルを別の方法で展開する必要がありますか、それとも実行可能な解決策がありますか? 私の現在のソリューションの 1 つの問題は、ほぼ同一であるが完全ではない複数の構成ファイルが必要なことです。したがって、1 つの変更を複数のファイルに追加する必要があります。これは避けたいことですが、ビルド時または適切なファイルをコピーする外部スクリプトを使用する場合を除いて、その方法がわかりません。
2 に答える
セットアップがより複雑かどうかはわかりませんが、同様の問題があり、環境(ユーザーがインストール中に選択する)に基づいて構成ファイルを更新するカスタムアクションクラスを追加してから、このカスタムアクションプロジェクトをセットアップに追加します事業。そうすれば、インストール先の環境に関係なく、1つのセットアップexeを使用できます。
興味があれば教えてください。サンプルや、それをどのように達成したかについての詳細を投稿できます。
詳細は次のとおりです。
- セットアッププロジェクトに新しいダイアログを追加して、ユーザーに環境を要求します(開発、qa、ステージング、本番の4つの環境で4つのラジオボタンダイアログを使用します)
- 4つのラジオボタンの値と、この値が設定するプロパティ、つまり「environment」(後者はCustomActionsクラスで使用されます)を構成します。
- 単一のクラス(CustomActions)を使用してソリューションにdllプロジェクトを追加します
CustomActionクラスで、ステップ2で構成したプロパティを次のように読み取ります。
if(!this.Context.Parameters.ContainsKey("environment")) { string error = "'environment' argument is null. Please configure config file manually"; //...handle your error, etc. return; } string env = this.Context.Parameters["environment"];
これで、env変数に、ステップで各ラジオボタンに割り当てた値が含まれます。次に、switchステートメントを使用して、ユーザーが選択した環境を決定できます。設定ファイルを次のように適切に更新します。
構成config=ConfigurationManager.OpenExeConfiguration(this.servicePath); //たとえば、使用する接続文字列を変更するには、次のようにします。config.ConnectionStrings.ConnectionStrings ["oracle"] = "dev conn string here";
セットアッププロジェクトに戻り、CustomActionsプロジェクトの出力をCustomActionsエディターに追加します([表示]メニュー->[エディター]->[カスタムアクション])。
最後に、セットアッププロジェクトのCustomActionDataプロパティを構成して、環境とその他の変数をCustomActionクラスに渡します(私のものは次のようになります:/ serviceFolder = "[TARGETDIR] \" /serviceExe="blahblah.exe" / serviceName = "MyServiceName "/ environment =" [ENVIRONMENT] "
それが理にかなっていて、あなたのソリューションに当てはまることを願っています!
仮定:
1) XML 設定ファイル
2) ビルド間の変更の総数が少ない (多くの構成ファイルにコピーされたとしても)
インストール時にインストーラーが構成ファイルの更新を処理するようにします
たとえば、インストーラーに WiX v3 を使用し、XmlFile 要素を使用して、インストール中にいくつかの構成ファイルを値で更新します。
<util:XmlFile Action="setValue" File="[DIRECTORIES.WEBSERVICES]web.config" ElementPath="//configuration/system.web/compilation" Name="debug" Value="false" Permanent="yes" / >