1

我尝试使用二进制文件为 postgresql zip 创建安装程序。在第一次安装时,我运行 initdb 并初始化 postgresql 集群并创建数据文件夹。在删除我的应用程序时,此数据目录不会删除。在同一目录中的下一次安装时,initdb 失败,因为目录不为空。我想搜索文件 [INSTALLFOLDER]/PostgreSql/postgresql.conf,如果它存在,则忽略 initdb 自定义操作。

我不能使用 DirectorySearch,因为它在 INSTALLFOLDER 存在之前。我读到有一种方法可以通过自定义操作调用目录搜索,但我找不到任何有关它的信息。如何检查 postgresql 集群是否已经初始化并跳过 init db 自定义操作。

4

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 Installer XML 模板下,选择 C# Custom Action Project。

要在安装程序 XML 源代码中引用自定义操作,假设自定义操作位于名为 InstallHelper.CA.dll 的 dll 中,您可能会遇到类似于以下代码的内容。请注意,仅当设置了属性 RUNINITDB 时,自定义操作 CallToRunInitDB 才会运行。

<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 回答