Wix安装程序:解压缩用户在安装期间选择的存档

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Wix安装程序:解压缩用户在安装期间选择的存档相关的知识,希望对你有一定的参考价值。

有一个允许用户从磁盘中选择zip文件的安装程序,我们想将该文件解压缩到安装目标目录中。

这是否可以使用标准的wix工具集/扩展?我们需要创建自定义操作吗?

目前,我们正在做像这样的CreateObject("Shell.Application"),然后像这个objShell.NameSpace(installDir).CopyHere(objShell.NameSpace(configPath).items), 20一样使用它

但我觉得这不是一个好方法,除了它还有Windows UAC的问题。


编辑:动机是有一个msi安装程序和几个自定义拉链。当客户安装应用程序时,他获取msi和其中一个拉链,并在安装时选择zip(或在自动安装中作为参数发送)。

答案

我喜欢使用的模式是在我的WiX安装程序中创建一个名为Extension.wxs的扩展点。此文件的默认(或标准)版本如下所示:

<?xml version="1.0" encoding="utf-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
    <Fragment>
        <DirectoryRef Id="INSTALLLOCATION">
            <!-- Setup all of the extension components here. -->
            <!-- For example...
            <Component Id="INSERT_COMPONENT_ID_HERE" Guid="{8451AFA1-5185-468D-B0A0-650494251D8F}">
                <File Id="INSERT_FILE_ID_HERE" KeyPath="yes" Source="SomeExtension.dll" />
            </Component> -->
        </DirectoryRef>             
    </Fragment>
    <Fragment>
        <ComponentGroup Id="ExtensionComponentGroup">
            <!-- Reference components that are extending the standard product here -->
            <!-- <ComponentRef Id="INSERT_COMPONENT_ID_HERE" /> -->            
        </ComponentGroup>
    </Fragment>
</Wix>

无论您定义哪个Feature都要自定义,您都可以添加对此ExtensionComponentGroup的引用,如下所示:

<Feature Id="MyMainFeature"
         Title="My Main Feature"
         Level="1"
         Description="An awesome feature, needed to run the application.">
  <ComponentGroupRef Id="MyMainComponentGroup" />
  <ComponentGroupRef Id="ExtensionComponentGroup" />
</Feature>

在我的例子中,我只使用一组Powershell脚本来构建我的安装程序,因为它可以更容易地动态确定要提供给WiX Toolset CLI的内容。所以,我对candle.exe的标准调用如下所示:

"C:Program Files (x86)WiX Toolset v3.11incandle.exe" -out .obj .srcProduct.wxs .srcExtension.wxs

但是,当我需要使用客户端特定文件自定义安装程序时,我只需更改命令行,使其指向自定义的Extension.wxs文件(将其“注入”到构建管道中):

"C:Program Files (x86)WiX Toolset v3.11incandle.exe" -out .obj .srcProduct.wxs .SomeClientWithSpecialNeedsExtension.wxs

使用Powershell时,自定义这些命令行调用变得更加容易,但为了简单起见,我省略了Powershell脚本。

总之,我建议您将zip文件的内容表示为单独的Component元素,并将其注入到安装程序的构建管道中。这些组件存储在由适当的Extension.wxs引用的ComponentGroup中。通过创建合适的默认(空的,没有组件)Feature文件,您仍然可以在没有任何自定义组件的情况下执行构建。使用此模式的另一个好处是,在卸载产品期间将卸载所有额外组件,并且您不必编写任何会增加安装程序维护开销的自定义操作!

希望这有助于某人。

另一答案

预处理器构造:如果您需要将设置的风格提供给不同的客户,我喜欢使用Extension.wxs为每个客户端编译MSI。 pre-processor constructs(也许检查底部的代码片段)。

预处理器构造正在使用中:我将通过上述链接的答案内联代码/标记进行一些调整,以期更清楚(我发现这是一种非常“编码器友好”的方法 - 这对于C ++开发人员而言是非常熟悉的领域特别 - 使用预处理器结构:

Here is a very lenghty description of this approach

基本上预处理器结构允许您在编译和链接之前动态更改WiX源文件,因此您可以随意包含或排除某些部分。您可以通过设置一些参数来完成此操作 - 例如客户端名称 - 然后您可以使用它输出特定的MSI文件名:<?define ClientName = “Apple” ?> <...> <!-- You can put your vendor-specific components in an include file --> <?if $(var.ClientName ) = "Apple" ?> <?include "AppleFeatures.wxi" ?> <?endif ?> <?if $(var.ClientName ) = "Microsoft" ?> <?include "MicrosoftFeatures.wxi" ?> <?endif ?> <...> YourProduct_AppleEdition.msi等...

以下是本地化变量,预处理器变量和包含文件之间差异的快速描述:YourProduct_SonyEdition.msi

以上是关于Wix安装程序:解压缩用户在安装期间选择的存档的主要内容,如果未能解决你的问题,请参考以下文章

Wix 安装程序中的文件夹(在安装期间创建)对所有用户不可见

在安装期间解压缩和重新压缩 XAP 文件以修改配置文件时出现问题

在卸载期间提示用户关闭应用程序(在 WiX 中)

带WPF引导程序的WIX Installer未设置%ERRORLEVEL%变量

使用wix安装程序中的复选框,根据用户选择安装的功能

在 WIX 升级期间重新启动 Windows 服务