如何忽略可选文件/组件的无效驱动器?

时间:2017-11-21 12:27:31

标签: wix windows-installer wix3 wix3.10

我使用WiX 3.10.3创建安装程序。我的安装程序将文件(可选)安装到用户的主目录(%HOMEDRIVE %% HOMEPATH%)。最近我从用户那里得到了这个截图:

error popup

安装程序启动后立即显示并暂停安装。显然,用户的主目录是H:\,它是映射的网络驱动器,但是已断开连接。我模拟了相同的情况并得到了同样的错误。到目前为止一切都很好。

如果我将此文件的安装路径设置为不存在的驱动器(B :)中的文件夹,则会出现其他错误:

drive error popup

安装程序启动后会立即显示此错误,并在单击" OK"

时中止安装。

如果我将其设置为可用驱动器中不存在的文件夹,则不会显示错误。我可以完成安装,安装程序创建完整路径并将文件放在那里。

现在,我的.wxs文件中没有任何内容可以检查驱动器的可用性,所以我想WiX会自动执行这些检查 - 但我找不到任何文档或提及WiX的这种行为的文本/博客。并且显然MSI正在进行这些检查:这些错误消息对应于Windows Installer Error Messages list中的错误1316和1327。 我的问题是,由于此文件是可选的,因此我不希望这些检查完成其路径。

即使无法安装此特定文件,我也希望安装程序跳过它并继续。使用" Abort"显示错误屏幕和#34; Skip"安装过程中的选项是理想的,但我的Google-fu也没有削减它。

2 个答案:

答案 0 :(得分:1)

我建议您创建此可选组件,以安装到安全位置的唯一目录,例如TARGETDIRINSTALLDIR或类似名称。也就是说,就像你说的那样有用。出于说明的目的,假设您将此目录称为HOMEDIR,并将组件HomeStuff称为:

: : :
<Directory Id="TARGETDIR" Name="SourceDir">
  <Directory Id="HOMEDIR" Name="Whatever">
    <Component Id="HomeStuff" ... />
  </Directory>
</Directory>
: : :

然后,在实际安装组件的场景中,使用documentation&#34;目录&#34;自定义操作(如果在计算成本后;否则使用type 35&#34;属性&#34;自定义操作)将HOMEDIR的路径更改为[%HOMEDRIVE][%HOMEPATH]

如果您不需要主目录存在以安装组件,那么在将HOMEDIR设置为主目录路径之前,您需要测试其存在。您还需要该场景的后备位置,并以某种方式将其实现为后备。 (最好将其设为原始位置,不要更新HOMEDIR。)

: : :
<CustomAction Id="SetHomeDir" Directory="HOMEDIR" Value="[%HOMEDRIVE][%HOMEPATH]"/>
: : :
<InstallExecuteSequence>
  : : :
  <!-- Set location if the component is being installed (not reinstalled)
       See Conditional Statement Syntax (https://msdn.microsoft.com/en-us/library/windows/desktop/aa368012) -->
  <Custom Action="SetHomeDir" After="...">$HomeStuff=3 AND ?HomeStuff &lt;&gt; 3</Custom>

  <!-- or, if you test for the home directory's existence -->
  <Custom Action="SetHomeDir" After="TestHomeDir">HOMEDIREXISTS</Custom>
</InstallExecuteSequence>
: : :

答案 1 :(得分:1)

更新:我刚刚发现这是一个老问题,我会留下我所写的内容。

我认为这与“部署用户个人资料文件”这个更大的一般性问题有关 - 这一点一直存在问题,如本摘要中所述: Create folder and file on Current user profile, from Admin Profile < /强>

特别重要的是Windows 10勒索软件保护功能可能会导致用户配置文件部署完全出现问题。其他安全软件也可能会干扰。

建议的答案

根据上面链接中的“讨论”,您的应用程序可以在启动时创建此文件吗?您的应用程序可以从安装在INSTALLDIR某处的模板中复制它 - 一次为您的应用程序的每个用户。无需担心其他部署问题。

这应该是一个比为设置添加大量自定义逻辑更可靠的解决方案,因为您的应用程序可以执行更好的检查和异常处理,而不是安装程序中可用的在可预测的模拟上下文和序列中运行(MSI安装程序需要处理复杂的条件,排序和模拟问题)。

此外,您的应用程序的启动顺序更易于调试和管理 - 它只是您熟悉的开发语言中的另一个源文件 - 再次,没有排序或模拟问题 - 只是您熟悉的开发工具和调试器。在我看来:对你来说是一块蛋糕 - 对于你来说,安装人员的世界可能是未知的,也许是一件令人讨厌的问题?

下面是一些更通用的注释,指出了一些您可能想要避免的Windows Installer缺陷。以上是“真实建议,回答”。

部署的呼吸复杂性

虽然不是最复杂的领域,安装人员和部署具有“ conspiratory complexity ”,但这并不是显而易见的(突然浮现的问题 - 你无法正常升级,卸载不起作用,修补失败,升级期间设置被覆盖等...)。归结起来,部署很复杂,这里有一个摘要:What is the benefit and real purpose of program installation?。开发人员制作第一个安装程序时会遇到许多常见问题:How do I avoid common design flaws in my WiX / MSI deployment solution?

使部署更简单,更简单,更简单......

此外:IMHO安装程序应该是“ dumber ”(只需复制文件并为第一次启动准备应用程序)和您的应用程序“更智能”(执行实际的应用程序配置, 对每个用户至关重要)。所有这些的基本原理可以在答案顶部的链接中找到,但一般来说,MSI安装程序由于其不寻常的复杂性而太脆弱,而且由于Windows设计更改的流程可能使“智能设置“以不可预测的方式摔倒。

作为具体示例:直接写入用户配置文件的MSI文件可能会面临运行时错误,因为Windows 10中添加了新的勒索软件保护功能(保护用户的数据文件夹不被写入“未知” “申请表”。默认情况下,此保护功能目前尚未启用,但如果Microsoft决定默认启用此功能,则可能会成为一个大问题。那时他们可能已经解决了这些MSI干扰问题。不过,请参阅上面关于用户个人资料部署的链接答案,以获取更难以预测和预见的更多此类“陷阱问题”。几个Windows补丁程序导致了奇怪的部署问题。简单的安装人员很少陷入这些熊陷阱。它主要是设置有很多自定义操作,可以触发异常问题。但是没有保证 - 我再次提到部署的复杂性和不可预测性 - 你永远不知道你所使用的系统处于什么状态。为了使这种复杂性更具体,你可以检查“部署的复杂性 “此处的部分(位于页面下方): Windows Installer and the creation of WiX 。请快速浏览一下,了解为什么我们警告“智能设置” - 如果不需要它们(有时没有其他选择 - 然后质量检查和实际测试是最重要的问题)。