为什么我的 Wix 自定义操作破坏了我的安装程序
Why is my Wix Custom Action is breaking my installer
在将文件从 cab 文件移动到硬盘驱动器时,我有一个非常好的 wix 安装程序。这些问题都是由我编写自定义操作的方式引起的。首先,我将展示罪魁祸首,然后解释症状。
<CustomAction Id="InstallElasticWithProvidedBatch" FileKey="fil85D231A31B2F8EB99C6B9EA4B95A354C" Impersonate="no" ExeCommand="install" Execute="deferred"/>
<CustomAction Id="RemoveElasticWithProvidedBatch" FileKey="fil85D231A31B2F8EB99C6B9EA4B95A354C" Impersonate="no" ExeCommand="remove" Execute="deferred"/>
<InstallExecuteSequence>
<Custom Action='InstallElasticWithProvidedBatch' Before='InstallFinalize'>NOT Installed</Custom>
<Custom Action='RemoveElasticWithProvidedBatch' Before='InstallFinalize'>REMOVE ~= "ALL"</Custom>
</InstallExecuteSequence>
这段代码应该做什么:
运行 service.bat 脚本将 elastic search 作为服务安装和卸载。首次安装应用程序时,应 运行 参数为 "install." 的 bat 卸载应用程序时,应 运行 参数为 "remove." 的 bat
怎么回事(多看几遍,挺有意思的):
安装非常顺利!文件被放到磁盘上并且服务被正确安装。当我卸载它时,我收到这条消息:
该应用程序然后卡在我的 Add/Remove 程序菜单中,我必须手动删除已安装的文件,然后筛选注册表以清除弹性搜索条目。
在后续安装中。我刚才链接你的错误信息不会回来了!并且该服务已正确删除。但是现在安装的文件不再被触及。
要重置这种情况,我必须更改 xml 文档中引用的每个文件的 GUID,但这只会让我回到安装时说它没有所需程序的位置正确卸载应用程序。
如果我删除自定义操作,安装程序将按预期工作(假设自上次安装程序损坏以来我已经更改了所有 50 个 guid)。有没有人对下一步尝试什么有任何提示?我在这个问题上耗费了 5 个小时。
旁注:WIX 老手常说的是根本不使用批处理文件,只是将文件功能转换为本机 Wix,但在这种情况下这不是一个非常有价值的过程。 .bat 文件由 elasticsearch 提供,非常神秘。
我的问题解决了!这是这一行的属性之一
<Custom Action='RemoveElasticWithProvidedBatch' Before='InstallFinalize'>REMOVE ~= "ALL"</Custom>
在我的案例中,正确的写法是
<Custom Action='RemoveElasticWithProvidedBatch' After='InstallInitialize'>REMOVE ~= "ALL"</Custom>
属性 Before='InstallFinalize'
导致批处理文件在安装程序有机会 运行 之前被杀死。这导致安装程序无法删除已安装的文件。要解决此问题,我会通过删除注册表项从 Add/Remove Programs 目录中手动删除已安装的程序。手动删除它们会导致 MSI 在以后的卸载中完全忽略 GUID。因此,第二次我将 运行 msi 的生命周期,bat 文件将正确地 运行 因为这次所有已安装的文件都单独保留(当它们应该被删除时)。由单个错位属性引起的难以发现的问题....
The .bat file is provided by elasticsearch and is incredibly cryptic.
请添加批处理文件,以便我们查看。使用批处理文件安装根本不是好的做法。它容易出错且易受攻击。
以下内容是在您最后发表上述评论之前写的:
Run the service.bat script to install and uninstall elastic search as
a service.
您不应使用批处理文件安装服务。您应该使用内置的 ServiceInstall and ServiceControl 表格。如果配置正确,这些表具有相当程度的“自动魔法”,并且可以防止您自己的脚本或批处理解决方案产生副作用。
The application is then stuck in my Add/Remove programs menu and I
have to manually delete the installed files and then sift through the
registry to clear out the elastic search entry.
这很危险。手动筛选注册表以删除 Windows 安装程序残留是破坏整个计算机安装的常见方法,因为 Windows 安装程序可能会进入锁定状态,根本不允许您安装或卸载。
on SUBSEQUENT installs. The error message I linked you moments ago
does not come back! AND the service is correctly removed. BUT the
files that were installed now don't get touched anymore.
以前安装的版本可能仍在注册表的 Windows 安装程序数据库中注册。更改组件 guid 将解决此问题,但注册表中仍有未注册的项目。
问题是:"Why is my Wix Custom Action is breaking my installer"
看着森林而不是树木的答案是,它破坏了您的安装程序,因为它是一个 300 行的 .BAT 文件。简而言之,这是一个流程外的过程,用劣质解决方案反模式重新发明轮子。
您可以在这里或那里修复它,让它不时地工作,但它确实需要去。你有充分的理由解释为什么它不能成功,所以这个答案是给下一个有类似问题但对成为软件专业人士更感兴趣的人的。
在这种情况下,我发现理解 .BAT 文件的每一行并不重要。这是废话,你可以假设其中 90% 是愚蠢的。
我看到的是 32 位与 64 位、java 检测等内容。这会转化为相互排斥的组件和应用程序搜索/启动条件等。
真正重要的是观察应用程序可能的最终安装状态,并根据您的要求使用它。自定义操作为什么会导致您的安装失败(这一次)并不重要,重要的一点是它是脆弱的、疯狂的愚蠢编码,它可能会以多种不同的方式使您失败。
在这里查看我的回答:Wix installer to replace INSTSRV and SRVANY for user defined service installation我喜欢说服务是服务是服务。鉴于正确的详细信息,我还没有遇到 MSI 无法处理的服务。
在将文件从 cab 文件移动到硬盘驱动器时,我有一个非常好的 wix 安装程序。这些问题都是由我编写自定义操作的方式引起的。首先,我将展示罪魁祸首,然后解释症状。
<CustomAction Id="InstallElasticWithProvidedBatch" FileKey="fil85D231A31B2F8EB99C6B9EA4B95A354C" Impersonate="no" ExeCommand="install" Execute="deferred"/>
<CustomAction Id="RemoveElasticWithProvidedBatch" FileKey="fil85D231A31B2F8EB99C6B9EA4B95A354C" Impersonate="no" ExeCommand="remove" Execute="deferred"/>
<InstallExecuteSequence>
<Custom Action='InstallElasticWithProvidedBatch' Before='InstallFinalize'>NOT Installed</Custom>
<Custom Action='RemoveElasticWithProvidedBatch' Before='InstallFinalize'>REMOVE ~= "ALL"</Custom>
</InstallExecuteSequence>
这段代码应该做什么:
运行 service.bat 脚本将 elastic search 作为服务安装和卸载。首次安装应用程序时,应 运行 参数为 "install." 的 bat 卸载应用程序时,应 运行 参数为 "remove." 的 bat
怎么回事(多看几遍,挺有意思的):
安装非常顺利!文件被放到磁盘上并且服务被正确安装。当我卸载它时,我收到这条消息:
该应用程序然后卡在我的 Add/Remove 程序菜单中,我必须手动删除已安装的文件,然后筛选注册表以清除弹性搜索条目。
在后续安装中。我刚才链接你的错误信息不会回来了!并且该服务已正确删除。但是现在安装的文件不再被触及。
要重置这种情况,我必须更改 xml 文档中引用的每个文件的 GUID,但这只会让我回到安装时说它没有所需程序的位置正确卸载应用程序。
如果我删除自定义操作,安装程序将按预期工作(假设自上次安装程序损坏以来我已经更改了所有 50 个 guid)。有没有人对下一步尝试什么有任何提示?我在这个问题上耗费了 5 个小时。
旁注:WIX 老手常说的是根本不使用批处理文件,只是将文件功能转换为本机 Wix,但在这种情况下这不是一个非常有价值的过程。 .bat 文件由 elasticsearch 提供,非常神秘。
我的问题解决了!这是这一行的属性之一
<Custom Action='RemoveElasticWithProvidedBatch' Before='InstallFinalize'>REMOVE ~= "ALL"</Custom>
在我的案例中,正确的写法是
<Custom Action='RemoveElasticWithProvidedBatch' After='InstallInitialize'>REMOVE ~= "ALL"</Custom>
属性 Before='InstallFinalize'
导致批处理文件在安装程序有机会 运行 之前被杀死。这导致安装程序无法删除已安装的文件。要解决此问题,我会通过删除注册表项从 Add/Remove Programs 目录中手动删除已安装的程序。手动删除它们会导致 MSI 在以后的卸载中完全忽略 GUID。因此,第二次我将 运行 msi 的生命周期,bat 文件将正确地 运行 因为这次所有已安装的文件都单独保留(当它们应该被删除时)。由单个错位属性引起的难以发现的问题....
The .bat file is provided by elasticsearch and is incredibly cryptic.
请添加批处理文件,以便我们查看。使用批处理文件安装根本不是好的做法。它容易出错且易受攻击。
以下内容是在您最后发表上述评论之前写的:
Run the service.bat script to install and uninstall elastic search as a service.
您不应使用批处理文件安装服务。您应该使用内置的 ServiceInstall and ServiceControl 表格。如果配置正确,这些表具有相当程度的“自动魔法”,并且可以防止您自己的脚本或批处理解决方案产生副作用。
The application is then stuck in my Add/Remove programs menu and I have to manually delete the installed files and then sift through the registry to clear out the elastic search entry.
这很危险。手动筛选注册表以删除 Windows 安装程序残留是破坏整个计算机安装的常见方法,因为 Windows 安装程序可能会进入锁定状态,根本不允许您安装或卸载。
on SUBSEQUENT installs. The error message I linked you moments ago does not come back! AND the service is correctly removed. BUT the files that were installed now don't get touched anymore.
以前安装的版本可能仍在注册表的 Windows 安装程序数据库中注册。更改组件 guid 将解决此问题,但注册表中仍有未注册的项目。
问题是:"Why is my Wix Custom Action is breaking my installer"
看着森林而不是树木的答案是,它破坏了您的安装程序,因为它是一个 300 行的 .BAT 文件。简而言之,这是一个流程外的过程,用劣质解决方案反模式重新发明轮子。
您可以在这里或那里修复它,让它不时地工作,但它确实需要去。你有充分的理由解释为什么它不能成功,所以这个答案是给下一个有类似问题但对成为软件专业人士更感兴趣的人的。
在这种情况下,我发现理解 .BAT 文件的每一行并不重要。这是废话,你可以假设其中 90% 是愚蠢的。
我看到的是 32 位与 64 位、java 检测等内容。这会转化为相互排斥的组件和应用程序搜索/启动条件等。
真正重要的是观察应用程序可能的最终安装状态,并根据您的要求使用它。自定义操作为什么会导致您的安装失败(这一次)并不重要,重要的一点是它是脆弱的、疯狂的愚蠢编码,它可能会以多种不同的方式使您失败。
在这里查看我的回答:Wix installer to replace INSTSRV and SRVANY for user defined service installation我喜欢说服务是服务是服务。鉴于正确的详细信息,我还没有遇到 MSI 无法处理的服务。