【问题标题】:MSI generated through WIX does not delete application root folder on uninstall通过 WIX 生成的 MSI 不会在卸载时删除应用程序根文件夹
【发布时间】:2015-05-05 12:28:01
【问题描述】:

我无法让 MSI 删除我的根应用程序文件夹。除根文件夹外,所有文件均在卸载时正确删除。 MSI 由 WIX 工具集生成。奇怪的是,这只发生在我们的构建服务器发出的 MSI 上。在我的本地计算机上生成的 MSI 工作正常,它们确实可以正确清理应用程序文件夹。我以详细模式运行卸载,但找不到任何令人担忧的东西。

过去,即使是我的本地计算机 MSI 也无法正常工作。但是我在 .wixproj 中添加了 KeepEmptyDirectories="true" GenerateGuidsNow="true" - 如果这是有用的信息。如何解决此问题?我应该寻找哪些可能的危险信号?

【问题讨论】:

    标签: wix windows-installer


    【解决方案1】:

    我会做几件事:

    1. 深入了解组件规则及其含义。 (当你打破它们时会出现什么问题。)

    2. 检查卸载日志文件以获取有关 Windows Installer 选择不删除文件夹的原因的线索。

    3. 在干净的机器上测试。 (VM 快照是最简单的。)

    虽然有些人可能会很幸运,但我不建议使用任何类型的动态 wxs 代码生成,除了动态 ProductCode 来支持重大升级。这包括从组件上的动态 guid 到组件收集(也称为动态文件链接)的所有内容。这些往往最终会破坏组件规则并产生副作用,包括您在此处看到的内容。

    也就是说,我理解手工编写 WiX XML 的痛苦,并且我在 CodePlex 上有一个名为 IsWiX 的开源项目。它由项目模板(脚手架)和图形设计器组成,极大地帮助创作和维护 WiX 项目。然后,您可以根据需要手动编辑 XML,以声明 IsWiX 尚未处理的内容。

    【讨论】:

    • 感谢您的回答。我不确定组件规则可能有什么问题。如果规则错误,为什么我本地构建的 MSI 可以正常工作?我详细检查了卸载日志,但没有什么令人担忧的。
    • 因为有时你可以通过打破规则侥幸逃脱,直到你不能。 Windows 具有注册表元数据,在某些情况下,您会发现自己处于错误的 Windows Installer 端,试图充分利用它所拥有的信息。这是在干净的快照虚拟机上进行测试的原因之一。
    • 熟悉组件规则对于 Windows Installer 的重要性怎么强调都不过分。请参阅this answer,看看它是否有助于理解它的核心。每个组件使用一个文件作为基本经验法则,链接中解释了一些例外情况(可能还有更多例外情况)。
    【解决方案2】:

    听起来文件夹本身有锁。您是否正在运行在卸载过程中要停止的任何服务?作为操作的一部分,您是否正在运行从根文件夹加载文件的任何自定义操作?您是否在根目录 ACL 上设置任何自定义权限?根文件夹是 IIS 文件夹吗?卸载后是否尝试重新启动以查看文件夹是否仍然存在?

    【讨论】:

    • 谢谢。根文件夹是 Windows 服务文件夹。有可能被锁定,但我不确定为什么我的本地机器 MSI 会完美地删除根文件夹。没有自定义操作。根文件夹没有自定义权限。我现在将尝试重新启动。
    • 那么当您说一个 MSI 工作正常而一个不能正常工作时,那是在完全受控的测试环境中吗? IE 完全相同的机器状态(VM 快照或映像还原)?
    • 来自构建服务器的 msi 不起作用。我本地机器上的 msi 工作正常。两者都在同一台机器相同的环境中进行测试。
    • 为什么我必须重启机器才能查看文件夹是否已被删除?
    • 我相信该文件夹可能已安排在重启时删除。
    【解决方案3】:

    显而易见的第一步是确保服务在卸载时被删除之前正确停止。这种行为在不同的盒子上可能会有所不同(但听起来你在同一个盒子上测试)。看到这个帖子:http://forum.installsite.net/index.php?showtopic=16458

    接下来,尝试对 MSI 文件本身以及它们提供/安装的文件夹进行一些差异,以验证可能有什么不同(如果有的话)。

    尝试对两个不同的 MSI 文件使用 Wix 工具包 中的 dark.exe。这会将它们解码为 Wix XML,然后使用比较工具(例如 Beyond Compare)或类似的磁盘差异工具来确定它们之间是否存在任何显着差异。

    Beyond Compare from http://www.scootersoftware.com/ - 是一款出色的工具(显然没有隶属关系)。我一直都在使用它,它的用处是立竿见影的,并且是所有处理文件的专业人员每天都会受益的工具。 试试看See a screenshot.

    另外对已安装的文件夹运行文件比较,看看是否有任何明显的差异。特别注意配置文件并进行完整的二进制级别差异(不仅仅是CRC /哈希)。

    HKCUHKLM 导出您的注册表配置单元(仅针对您的应用程序,而不是整个注册表)并在前后比较它们也有州(4 个出口)。

    至于机器之间看到的差异 - 听起来您正在使用测试虚拟机,但我只想补充一点,即使其他一切都相同,您的机器上存在 Visual Studio 也会影响事情。除了硬件、网络和防火墙配置听起来都一样,而且您正在测试盒上进行测试。

    您是否尝试过使用dependency walker?我从未将它用于服务,但分析选项对于检查一般应用程序很有用 (how-to)。

    【讨论】:

    • 尝试将 MSI 导出到 Wix XML - 两个 .wxs 文件之间没有差异。卸载日志中是否有我应该特别寻找的危险信号?没试过依赖walker。
    • 抱歉 - 我是 WIX 和 Windows 安装新手。不熟悉组件和表格等。需要快速修复错误,因此没有时间了解整个 WIX 和安装架构。如果您需要查看 .wxs、.wixpdb 等,请告诉我。
    • 是的,我想我们必须看到这个的 wix 源文件,它很大吗?
    • 您是在同一个测试系统上安装两个 MSI,还是在自己的机器上测试您编译的那个?
    • 如果您需要快速修复错误而不花时间了解 Windows Installer 开发,您可能需要一位顾问。我可能认识一个。 ;)
    猜你喜欢
    • 2016-06-16
    • 2011-05-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-18
    • 2015-03-25
    • 1970-01-01
    相关资源
    最近更新 更多