我有一个自定义操作,可以将文件添加到安装目录中。卸载程序时,另一个自定义操作会尝试删除这些文件,以便删除安装目录。
问题是我的自定义卸载操作在删除标准安装文件后运行,因此安装目录留在那里,尽管它是空的。
配置看起来类似于:
<CustomAction Id="AddFilesAction" BinaryKey="installerActions" DllEntry="AddFiles" Execute="deferred" Return="check" Impersonate="no" />
<CustomAction Id="CleanupAction" BinaryKey="installerActions" DllEntry="Cleanup" Execute="deferred" Return="check" Impersonate="no" />
<InstallExecuteSequence>
<Custom Action="CleanupAction" Before="InstallFiles">Installed</Custom>
<Custom Action="AddFilesAction" After="InstallFiles">NOT Installed</Custom>
</InstallExecuteSequence>
我可以在msi开始删除安装文件之前运行CleanupAction
运行,以便自定义文件已被删除,msi可以删除主安装目录吗?
答案 0 :(得分:6)
问题是我的自定义卸载操作在删除标准安装文件后运行
那是因为您已经在InstallFiles
之前安排了RemoveFiles
InstallExecuteSequence
之后的Sequence
。您还可以在Orca或InstEd等编辑器中打开MSI文件,并查看RemoveFiles
表。按<Custom Action="CleanupAction" Before="RemoveFiles">
(REMOVE~="ALL") AND (NOT UPGRADINGPRODUCTCODE)
</Custom>
列对其进行排序,以查看执行顺序。
我可以在msi开始删除之前运行CleanupAction 安装文件
当然,只需在RemoveFile
之前安排它:
RemoveFolderEx
编辑:在SteinÅsmul让我意识到这一点后,我也改进了自定义动作条件。 standard InstallExecuteSequence
详细推理。
如果您还不知道,WiX已经支持删除应用程序生成的文件,这些文件可能会替换您的自定义操作。它以See his answer和RemoveFile
元素的形式出现。
如果这些不满足您的需求,所以您仍然需要自定义操作,我建议在运行时为<{1}}表中添加要删除的文件的临时记录(在中自定义操作!)。这为您提供了使用MSI引擎进行实际文件删除的好处,即:即如果用户决定取消卸载或发生错误,则自动回滚。我过去曾经这样做过(在发明index.html
之前),所以如果你需要更多信息,可以问另一个问题。
答案 1 :(得分:4)
简答 :您的病情和排序似乎是错误的。请安排清理自定义操作在 RemoveFiles
之前运行,并且可能设置更好的条件,以便仅在需要时运行操作(不在意外的设置模式下)。我建议 (REMOVE~="ALL") AND (NOT UPGRADINGPRODUCTCODE)
。如果您使用此条件,请彻底测试。 此条件说明如下。
快速示例 :
<InstallExecuteSequence>
<Custom Action="CleanupAction"
Before="RemoveFiles">(REMOVE~="ALL") AND (NOT UPGRADINGPRODUCTCODE)</Custom>
</InstallExecuteSequence>
请务必阅读以下详细信息。您可能还希望收紧复制文件操作的条件 - 因为它也会在主要升级时运行 - 这可能是您想要的也可能不是。
自定义操作更改 :Please avoid custom actions if you can - 一些自定义操作问题的摘要 - 它们很严重)。自定义操作是部署失败的主要原因。你确定需要它们吗?通常,还有其他方法可以使用内置MSI功能或特定于WiX的构造来实现您在自定义操作中实现的内容。常见的例子是:安装服务,删除文件,更新XML文件或INI文件等等......有时候自定义操作是必要的 - 显然。 Zett42 has already written well about the alternatives,所以我在此不再重复 - 请检查他/她的答案。
RemoveFiles :此处还有其他问题 - 我将尝试在下面介绍这些问题 - 但在标准操作 RemoveFiles
时会卸载文件运行。换句话说,您需要将清理自定义操作安排在InstallExecuteSequence
中的此标准操作之前运行。
条件 :您的清除自定义操作的条件 Installed
将使自定义操作在modify
上运行,repair
和minor upgrade patching
以及uninstall
和major upgrade initiated uninstalls
。这很可能不是你想要的。要指定仅在卸载时运行,最常用的条件是 REMOVE~="ALL"
。这将使清理发生在手动启动的卸载以及主要升级启动的卸载(不是我想要的)。您可以尝试(REMOVE~="ALL") AND (NOT UPGRADINGPRODUCTCODE)
(仅在常规卸载时运行 - 而不是在主要升级卸载时运行)。
提示 :即使对于有经验的WiX / MSI用户,条件也很容易搞砸。一些可能有用的资源:
REMOVE
属性相关的内容 - 但总的来说可以作为概述和速成课程)更多链接(供参考) :
答案 2 :(得分:0)
我不会在InstallInitialize和InstallFinalize之间安排您的操作。在Initialize之前放置文件并在Finalize之后清理文件。请注意,您将在InstallFinalize之后丢失属性值,并且您需要考虑到这一点。