1

バイナリを使用してpostgresql zipのインストーラーを作成しようとしています。最初のインストールで initdb を実行すると、postgresql クラスターが初期化され、データ フォルダーが作成されます。アプリを削除しても、このデータ ディレクトリは削除されません。同じディレクトリへの次回のインストールでは、ディレクトリが空ではないため、initdb が失敗します。ファイル [INSTALLFOLDER]/PostgreSql/postgresql.conf を検索し、存在する場合は initdb カスタム アクションを無視します。

INSTALLFOLDER が存在する前なので、DirectorySearch を使用できません。カスタム アクションを介してディレクトリ検索を呼び出す方法があることを読みましたが、それに関する情報が見つかりません。postgresql クラスターが既に初期化されていることを確認し、init db カスタム アクションをスキップする方法。

4

1 に答える 1

1

1 つの解決策は、ファイルの存在を確認するための即時実行カスタム アクションを作成することです。その場合は、プロパティを設定し、そのプロパティを初期化カスタム アクションの条件で使用します。

以下の C# マネージ カスタム アクションの例では、"SOMEPROPERTY" の値を取り、対応するディレクトリが存在する場合は、プロパティ RUNINITDB=1 を設定します。その後、初期化カスタム アクションの条件で RUNINITDB を使用できます。プロパティ RUNINITDB が存在する場合は、カスタム アクションを実行します。

[CustomAction]
public static ActionResult CheckInitDb(Session session)
{
   session.Log("Begin CheckInitDb");
   string dir = session["SOMEPROPERTY"]; //or you could figure this out programmatically

   if(!Directory.Exists(dir))
   {
       session["RUNINITDB"] = "1";
       session.Log("Setting RUNINITDB bit.");
   }

   return ActionResult.Success;
}

上記のカスタム アクション プロジェクトを作成するには、新しい Visual Studio プロジェクトを作成し、Windows インストーラー XML テンプレートで [C# カスタム アクション プロジェクト] を選択します。

インストーラ XML ソース コードでカスタム アクションを参照するには、カスタム アクションが InstallHelper.CA.dll という名前の dll にあると仮定すると、次のようなコードになる可能性があります。カスタム アクション CallToRunInitDB は、プロパティ RUNINITDB が設定されている場合にのみ実行されることに注意してください。

<Binary Id="InstallHelper" SourceFile="InstallHelper.CA.dll"/>
<CustomAction Id="CheckInitDb" BinaryKey="InstallHelper" DllEntry="CheckInitDb" Execute="immediate" Return="check"/>

<InstallExecuteSequence>
    <Custom Action="CheckInitDb" Before="InstallInitialize">NOT (REMOVE ~= "ALL")</Custom>
    <Custom Action="YourCallToRunInitDB" After="InstallInitialize">RUNINITDB</Custom>
</InstallExecuteSequence>

WiX マネージド カスタム アクションに慣れていない場合は、SO で他のサンプル コードを見つけることができるかもしれません: https://stackoverflow.com/search?q=wix+managed+custom+action

于 2013-09-17T18:00:53.780 に答える