【问题标题】:How to ignore invalid drive for an optional file/component?如何忽略可选文件/组件的无效驱动器?
【发布时间】:2017-11-21 12:27:30
【问题描述】:

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

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

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

安装程序启动后也会显示此错误,并在我单击“确定”时中止安装。

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

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

即使无法安装此特定文件,我也希望安装程序跳过它并继续。在安装过程中显示带有“中止”和“跳过”选项的错误屏幕是理想的,但我的 Google-fu 也没有削减它。

【问题讨论】:

  • 是什么让这个文件“可选”?一般来说,文件要么安装,要么不安装,它们在(比如)传递组件或功能中是可选的?我问是因为这可能有助于我们提供解决方案。
  • 这是一个配置文件,让目前只有我们的高级用户的生活更轻松。应用程序可以在没有此文件的情况下以默认配置运行。

标签: wix windows-installer wix3 wix3.10


【解决方案1】:

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

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

然后,在实际安装组件的场景中,使用type 35“目录”自定义操作(如果在成本计算之后;否则使用type 51“属性”自定义操作) 将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>
: : :

【讨论】:

    【解决方案2】:

    更新:我刚刚发现这是一个老问题,无论如何我都会留下我写的内容。


    我认为这与“部署用户配置文件”这一更大的一般问题有关——正如这个小摘要中所述,这一直是个问题:Create folder and file on Current user profile, from Admin Profile.

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


    建议的答案

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

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

    此外,您的应用程序的启动序列总体上更易于调试和管理 - 它只是您熟悉的开发语言中的另一个源文件 - 而且,没有排序或模拟问题 - 只是您熟悉的开发工具和调试器。在我看来:小菜一碟 - 安装程序的世界对你来说可能是未知的,也许是一个讨厌的问题?


    以下是一些更通用的 cmets,用于指出您可能希望避免的一些 Windows Installer 陷阱。以上是“真正的建议,答案”。

    部署的阴谋复杂性

    虽然不是最复杂的领域,但安装程序和部署的特点是“阴谋复杂性”并不立即明显(突然出现的问题 - 您无法正确升级,卸载不起作用,修补失败,设置在升级过程中被覆盖,等等......)。归根结底,部署很复杂,这里有一个总结:What is the benefit and real purpose of program installation?。开发人员在制作第一个安装程序时遇到了许多常见问题:How do I avoid common design flaws in my WiX / MSI deployment solution?

    让部署更简单、更简单、更简单...

    进一步:恕我直言,安装程序应该是“dumber”(只需复制文件并为首次启动准备应用程序)和您的应用程序“smarter”(执行实际的应用程序配置, 对每个用户都至关重要)。所有这一切的基本原理都可以在答案顶部的链接中找到,但总的来说,MSI 安装程序太容易受到攻击,因为它们异常复杂,而且由于 Windows 设计更改的持续流可能使“智能”设置”以不可预知的方式失败。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-11-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多