我尝试使用二进制文件为postgresql zip创建安装程序。在第一次安装时,我运行initdb并初始化postgresql集群并创建数据文件夹。在删除我的应用程序时,此数据目录不会删除。在同一dir中的下一次安装时,initdb失败,因为目录不为空。 我想搜索文件[INSTALLFOLDER] /PostgreSql/postgresql.conf,如果它存在,则忽略initdb自定义操作。
我无法使用DirectorySearch,因为它存在于INSTALLFOLDER之前。我读到有一种方法可以通过自定义操作调用目录搜索,但我找不到任何关于它的信息。 我如何检查postgresql集群是否已初始化并跳过init db custom action。
答案 0 :(得分: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中,您可能会遇到类似于以下代码的操作。请注意,自定义操作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