5

私のカスタム Burn 管理ブートストラップ アプリケーションでは、顧客がインストール ログを簡単に見つけられるように、インストーラのデフォルト ログ ディレクトリを設定する方法が必要です。これができない場合は、インストール後にログ ファイルをコピーする適切な方法が必要です。

セットアップ プロジェクト (つまり、Bundle.wxs) とマネージ ブートストラップ アプリケーションで WixBundleLog 変数を設定しようとしましたが、うまくいきませんでした。また、私のブートストラップ アプリケーションは十分に汎用的であるため、さまざまな製品やインストール パッケージで使用できます。そのため、パッケージ名をハードコーディングせずに、各パッケージのインストール ログを設定/取得できる柔軟性のあるソリューションが必要です。私のブートストラッパーアプリケーションで。

ユーザーにコマンドラインで「-l」または「-log」を強制的に使用させずにこれを行う方法があるはずです。

4

1 に答える 1

11

WixBundleLogは、ログ ファイルを指定する書き込み変数です。「Wix」プレフィックスを含むバンドルでは変数を設定できないため、バンドルでそれをオーバーライドすることはできません。ブートストラップ アプリケーションでそれをオーバーライドしても機能しません。ブートストラップはデフォルトに引き続きログを記録するためです。

書き込みブートストラップは、ブートストラップ ログとインストール パッケージ ログの文字列変数を設定します。これらの変数をリストで追跡します。したがって、コンストラクターには次のようなものがあります。

this.LogsDirectory = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.CommonDocuments), @"Company_Name\Logs\Installer\", DateTime.Now.ToString("yyyyMMdd_hhmmss"));
_logVariables = new List<string>();
_logVariables.Add("WixBundleLog");

Burn はログ ファイルの文字列変数を [WixBundleLog]_PackageId の形式で設定します。私のブートストラッパー アプリケーションでは、PlanPackageCompleteイベントが発生したときに、変数をリストに追加する次のコードを含むイベント ハンドラーがあります。

//set *possible* log variables for a given package
_logVariables.Add("WixBundleLog_" + e.PackageId);
_logVariables.Add("WixBundleRollbackLog_" + e.PackageId);

インストールの最後に、またはブートストラップでエラーが発生した場合は、次のメソッドを呼び出します。

private void CopyLogs()
{
     if (!Directory.Exists(this.LogsDirectory))
         Directory.CreateDirectory(this.LogsDirectory);

     foreach (string logVariable in _logVariables)
     {
         if (this.Bootstrapper.Engine.StringVariables.Contains(logVariable))
         {
             string file = this.Bootstrapper.Engine.StringVariables[logVariable];
             if (File.Exists(file))
             {
                 FileInfo fileInfo = new FileInfo(file);
                 fileInfo.CopyTo(Path.Combine(this.LogsDirectory, fileInfo.Name), false);
             }
         }
     }
 }
于 2012-05-24T16:02:10.473 に答える