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

时间:2018-06-05 10:58:39

标签: .net wix windows-installer

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

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

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

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

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

2 个答案:

答案 0 :(得分:0)

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

<?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.11\bin\candle.exe" -out .\obj .\src\Product.wxs .\src\Extension.wxs

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

"C:\Program Files (x86)\WiX Toolset v3.11\bin\candle.exe" -out .\obj .\src\Product.wxs .\SomeClientWithSpecialNeeds\Extension.wxs

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

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

希望这对某人有帮助。

答案 1 :(得分:0)

预处理器构造 :如果您需要为不同的客户提供各种设置,我喜欢使用 pre-processor constructs 为每个客户端编译一个MSI。 Here is a very lenghty description of this approach(也许可以检查底部的代码段)。

正在使用的预处理器构造 :我将上面的代码/标记内联,并通过一些调整将答案链接在一起,以期使其更加清晰(我发现了这一点)一种非常“编码友好”的方法-特别是对于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.msi YourProduct_SonyEdition.msi ,等等...

以下是本地化变量预处理程序变量包含文件之间的区别的简要说明: {{3 }}