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



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

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

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

但我觉得这不是一个好方法,除此之外,它还存在Windows UAC的问题。


编辑:动机是拥有一个MSI安装程序和几个自定义zip。当客户安装应用程序时,他会获取 msi 和其中一个 zip,并在安装时选择 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工具集CLI的内容。因此,我对candle.exe的标准调用如下所示:

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

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

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

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

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

希望这对某人有所帮助。

预处理器构造 :如果您需要向不同的客户提供您的设置风格,我喜欢使用pre-processor constructs为每个客户端编译 MSI。这是对这种方法的非常详细的描述(也许可以检查底部的代码片段(。

使用中的预处理器构造 :我将内联上面的代码/标记,链接答案并进行一些调整,希望使其更清晰(我发现这是一种非常"编码友好"的方法 - 对于C++开发人员来说,这是非常熟悉的领域 - 使用预处理器构造(:

<?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 ?>
<...>

本质上,预处理器构造允许您在编译和链接WiX源文件之前动态更改该文件,因此您可以随意包含或排除某些部分。您可以通过设置一些参数(例如客户端名称(来执行此操作,然后您可以使用这些参数来输出特定的 MSI 文件名:YourProduct_AppleEdition.msiYourProduct_SonyEdition.msi等...

以下是本地化变量、预处理器变量包含文件之间差异的快速描述:WiX (Windows Installer Xml(、创建通用变量

相关内容

最新更新