Installation Windows installer太聪明了,在测试仪删除配置文件时尝试修复

Installation Windows installer太聪明了,在测试仪删除配置文件时尝试修复,installation,windows-installer,Installation,Windows Installer,我们的应用程序通过msi文件部署到目标机器上。一切都很好。我们的测试人员已经完成了他的计划,其中一个测试需要删除应用程序的配置文件。该应用程序设计用于在启动时通过对话框提醒用户缺少配置。然而,发生的事情是——不知怎么的!——软件再次启动安装程序并从msi中检索丢失的文件!这很好,但不是我们想要的。如何禁用该行为?不深入了解windows installer机制如果您对此感兴趣,可能会宣传该软件的快捷方式,这意味着windows installer会在软件启动前检查所有内容是否到位 如果可以编辑m

我们的应用程序通过msi文件部署到目标机器上。一切都很好。我们的测试人员已经完成了他的计划,其中一个测试需要删除应用程序的配置文件。该应用程序设计用于在启动时通过对话框提醒用户缺少配置。然而,发生的事情是——不知怎么的!——软件再次启动安装程序并从msi中检索丢失的文件!这很好,但不是我们想要的。如何禁用该行为?

不深入了解windows installer机制如果您对此感兴趣,可能会宣传该软件的快捷方式,这意味着windows installer会在软件启动前检查所有内容是否到位

如果可以编辑msi,请将快捷方式设置为非公告。 如果不能,请使用安装

e、 g.msiexec/i myMsi.msi DISABLEADVTSHORTCUTS=1

请注意,这只是一个快速而肮脏的解决方法, 要正确解决此问题,您需要了解整个windows installer广告(也称为修复或自我恢复机制)。
但是解释所有的原因和修复机制远远超出了这个答案,在互联网上,特别是在MSDN和stackoverflow上,有很多关于这方面的文章和帖子,但没有深入了解windows installer机制,如果你感兴趣的话,有很多关于这方面的文章,该软件的快捷方式可能是广告,这意味着windows安装程序在启动该软件之前会检查所有东西是否就位

如果可以编辑msi,请将快捷方式设置为非公告。 如果不能,请使用安装

e、 g.msiexec/i myMsi.msi DISABLEADVTSHORTCUTS=1

请注意,这只是一个快速而肮脏的解决方法, 要正确解决此问题,您需要了解整个windows installer广告(也称为修复或自我恢复机制)。
但是解释所有的原因和修复机制远远超出了这个答案,在互联网上,特别是在MSDN和stackoverflow上,有相当多的文章和帖子,你没有提到你正在使用什么工具来制作你的MSI,但我要冒险猜测Visual Studio部署项目.VDRPOJ

这个工具有很多可怕的地方,其中之一就是它没有揭示组件的基本概念。相反,它使每个文件都成为它自己组件的关键文件,并对您隐藏组件的存在。我说“是”是因为微软在VS中终止了这个项目类型。大约有5万人抱怨UserVoice把这个工具带回来了,我猜他们中有49990人不知道关键路径是什么

Windows Installer有一个称为组件规则的概念,每个组件都有一个键路径。keypath教会MSI如何处理修复场景。但是,您的工具必须允许您能够控制它以使其工作

Windows Installer的运行方式与预期的完全相同。你只是没有跟上这是什么


但是,如果您想忽略Windows Installer最佳实践并继续使用今天使用的工具,那么诀窍是将app.config文件安装为不同的文件。然后让应用程序在运行时将文件复制到真实的文件名。Windows Installer不会为它没有安装的东西提供服务。

你没有提到你正在使用什么工具来制作你的MSI,但我会冒险猜测Visual Studio部署项目。VDRPOJ

这个工具有很多可怕的地方,其中之一就是它没有揭示组件的基本概念。相反,它使每个文件都成为它自己组件的关键文件,并对您隐藏组件的存在。我说“是”是因为微软在VS中终止了这个项目类型。大约有5万人抱怨UserVoice把这个工具带回来了,我猜他们中有49990人不知道关键路径是什么

Windows Installer有一个称为组件规则的概念,每个组件都有一个键路径。keypath教会MSI如何处理修复场景。但是,您的工具必须允许您能够控制它以使其工作

Windows Installer的运行方式与预期的完全相同。你只是没有跟上这是什么


但是,如果您想忽略Windows Installer最佳实践并继续使用今天使用的工具,那么诀窍是将app.config文件安装为不同的文件。然后让应用程序在运行时将文件复制到真实的文件名。Windows Installer不会为它未安装的内容提供服务。

对此有一个更正确的答案,并且它不会被禁用。您在MSI文件中将组件id设置为null,以防止修复单个文件。请参见组件注释 e:

使用Orca编辑MSI文件以删除组件ID,并编写卸载自定义操作以在卸载时删除文件(如果存在)


此外,这是一个冗余测试。如果该文件丢失,Windows将为您还原该文件,因此您需要测试来通知该文件丢失的想法是毫无意义的。真正的测试应该是,如果文件丢失,Windows将恢复该文件,并且您的应用程序可能不需要对丢失的文件做任何处理。

对此有一个更正确的答案,并且它不是禁用的dvtshortcuts。您在MSI文件中将组件id设置为null,以防止修复单个文件。请参见此处的组件注释:

使用Orca编辑MSI文件以删除组件ID,并编写卸载自定义操作以在卸载时删除文件(如果存在)


此外,这是一个冗余测试。如果该文件丢失,Windows将为您还原该文件,因此您需要测试来通知该文件丢失的想法是毫无意义的。真正的测试应该是,如果文件丢失,Windows将恢复该文件,并且您的应用程序可能不需要对丢失的文件执行任何操作。

提供了几个可行的答案:

您可以使用空白guid安装该文件。然后需要使用RemoveFile功能在卸载时将其删除。如果要在升级过程中更换,也会遇到问题。有时可能会很棘手。 你可以禁用广告的快捷方式,但我认为这影响太大了。 最后,您可以根据我的建议安装一个单独的非广告快捷方式来启动应用程序。这样的快捷方式可以绕过自修复检查。它仍然可以通过其他方式调用,例如缺少文件关联、COM注册或类似方式,但这些都是异常状态。 然而,我的偏好是,如果可能的话,应用程序可以在没有配置文件的情况下启动。我总是建议一个好的启动程序,内部默认值可用。如果遇到任何文件系统访问被拒绝的情况,启动例程也应该正常降级

最重要的是,您应该将此配置文件放在userprofile中,以便在首次启动时为相关用户生成该文件。它甚至可以从主安装目录中的只读副本复制


当您从内部默认值生成文件并将其放置在userprofile位置时,该文件将不会与Windows Installer产生任何干扰。由此产生的问题是如何在卸载时清理用户数据。我曾与Stefan Kruger MSI MVP讨论过这一点,我同意他的观点,即用户数据实际上是用户数据,不应该由安装程序自动处理。保持安装状态,并在必要时通过系统管理员工具(例如登录脚本)进行清理。

提供了几个可行的答案:

您可以使用空白guid安装该文件。然后需要使用RemoveFile功能在卸载时将其删除。如果要在升级过程中更换,也会遇到问题。有时可能会很棘手。 你可以禁用广告的快捷方式,但我认为这影响太大了。 最后,您可以根据我的建议安装一个单独的非广告快捷方式来启动应用程序。这样的快捷方式可以绕过自修复检查。它仍然可以通过其他方式调用,例如缺少文件关联、COM注册或类似方式,但这些都是异常状态。 然而,我的偏好是,如果可能的话,应用程序可以在没有配置文件的情况下启动。我总是建议一个好的启动程序,内部默认值可用。如果遇到任何文件系统访问被拒绝的情况,启动例程也应该正常降级

最重要的是,您应该将此配置文件放在userprofile中,以便在首次启动时为相关用户生成该文件。它甚至可以从主安装目录中的只读副本复制


当您从内部默认值生成文件并将其放置在userprofile位置时,该文件将不会与Windows Installer产生任何干扰。由此产生的问题是如何在卸载时清理用户数据。我曾与Stefan Kruger MSI MVP讨论过这一点,我同意他的观点,即用户数据实际上是用户数据,不应该由安装程序自动处理。让它保持安装状态,并在必要时通过系统管理员工具(例如登录脚本)进行清理。

修复的路径不止一条。是的,我知道,但我假设修复在应用程序启动时开始是的,他会认为他的问题已经解决,直到有其他东西触发它。当然有人会过来说禁用windows installer服务或运行msizap。。。。那会解决的你说得对,我编辑了我的帖子。比msizap更好的是用空字符串替换所有组件GUID,这实际上是可行的。。。

. 在使用了一段时间被称为windows installer的黑魔法和被误解的技术之后,我们都看到了一些技巧;我有100美元,他的工具不允许他这么做。我做MSI已经15年了,我使用了所有的工具。我经常可以通过你遇到的问题来准确地告诉你你在使用什么工具。修复的途径不止一条。是的,我知道,但我假设修复从应用程序启动时开始是的,他会认为他的问题已经解决,直到有其他东西触发它。当然有人会过来说禁用windows installer服务或运行msizap。。。。那会解决的你说得对,我编辑了我的帖子。比msizap更好的是用空字符串替换所有组件guid,这实际上是可行的。。。。在使用了一段时间被称为windows installer的黑魔法和被误解的技术之后,我们都看到了一些技巧;我有100美元,他的工具不允许他这么做。我做MSI已经15年了,我使用了所有的工具。我经常可以通过你遇到的问题来告诉你你在使用什么工具。不管你想要什么,我只是想帮你省去我一年来为使这个工具发挥作用所经历的痛苦。我们在几十个分支上为几十个应用程序开发产品线,每个安装程序都有大约200个功能、2000个合并模块和20000个文件。它就是不起作用。我希望我能在实验室里度过的每一个深夜都能回来解决维修问题。我同意克里斯的观点。不要使用任何VisualStudio部署项目或VisualStudio中除Wix以外的任何其他方法。我要说的是,没有人能够以合理及时的方式仅使用Orca或Visual Studio交付高质量的MSI。这里面有太多的复杂性和意识形态上的混乱。不管你怎么想,我只是想帮你省去一整年来我为使这个工具正常工作所经历的痛苦。我们在几十个分支上为几十个应用程序开发产品线,每个安装程序都有大约200个功能、2000个合并模块和20000个文件。它就是不起作用。我希望我能在实验室里度过的每一个深夜都能回来解决维修问题。我同意克里斯的观点。不要使用任何VisualStudio部署项目或VisualStudio中除Wix以外的任何其他方法。我要说的是,没有人能够以合理及时的方式仅使用Orca或Visual Studio交付高质量的MSI。这涉及到太多的复杂性和ideosyncrazies。您使用什么工具来编写您的.MSI?Visual Studio安装项目在VS2010中令人羞愧。这件事太可怕了,所以我们坚持到2010年。这是一个很小的项目,因为它是针对嵌入式标准7设备的。如果你想使用WiX和IsWiX的免费演示,请发电子邮件给我。我想你会发现这是一个伟大的大门,以充分发挥微星。下面有很多很好的答案。问题是,您的工具不会向您公开其中的任何内容。快捷方式总是在VDPROJ中公布。我们必须编写生成自动化来调整MSI后期生成以修复此问题和其他许多问题。您使用什么工具来编写.MSI?Visual Studio安装项目在VS2010中令人羞愧。这件事太可怕了,所以我们坚持到2010年。这是一个很小的项目,因为它是针对嵌入式标准7设备的。如果你想使用WiX和IsWiX的免费演示,请发电子邮件给我。我想你会发现这是一个伟大的大门,以充分发挥微星。下面有很多很好的答案。问题是,您的工具不会向您公开其中的任何内容。快捷方式总是在VDPROJ中公布。我们必须编写构建自动化来调整MSI后期构建以修复此问题和许多其他问题。这是正确的,我自己也使用过。但是,我更喜欢通过将QAINSTALL=1传递到msiexec.exe命令行,在桌面上创建一个非播发的快捷方式。这将在没有自我修复问题的情况下启动应用程序。测试人员还可以学习手动创建快捷方式或直接从安装文件夹启动exe。所有这些都假设有一个exe。这里有一系列的注释被移动到聊天室。关键是要修复的路径不止一条:是的,我有点喜欢“丢失时替换”选项。尽管如此,测试计划仍然是测试计划:-正如Chris一直说的,需要修复的路径不止一条,禁用公布的快捷方式不会像空组件id那样消除对该文件的修复。另外,为什么禁用整个产品的修复只是为了避免修复单个文件?这是正确的,我自己也使用过。但是,我更喜欢通过将QAINSTALL=1传递到msiexec.exe命令行,在桌面上创建一个非播发的快捷方式。这将在没有自我修复问题的情况下启动应用程序。测试人员还可以学习手动创建快捷方式或直接从安装文件夹启动exe。所有这些都假设有一个exe,但是
这里的ts被移动到聊天室。关键是要修复的路径不止一条:是的,我有点喜欢“丢失时替换”选项。尽管如此,测试计划仍然是测试计划:-正如Chris一直说的,需要修复的路径不止一条,禁用公布的快捷方式不会像空组件id那样消除对该文件的修复。另外,为什么只为了避免修复单个文件而禁用整个产品的修复?有关处理用户配置文件数据和清理的讨论可在此处找到:。有点冗长,但如果您选择在用户配置文件中保存配置数据,请务必阅读。有关处理用户配置文件数据和清理的讨论可在此处找到:。有点冗长,但如果您选择在用户配置文件中保存配置数据,请务必阅读它。