捆绑 WiX Burn 的多个支持文件

Jam*_*s R 6 windows-installer wix burn

我有一个供应商向我提供的第三方 MSI。然而,MSI 并不是独立的,它需要多个支持文件(dll、配置文件、设备驱动程序...)才能完成安装。我尝试在 MSI 目录中不存在这些文件的情况下进行安装,但它在安装过程中抱怨缺少文件。在我看来,这是构建安装程序的一种奇怪的方式。不管怎样,我想捆绑这个“安装”以供 Burn 使用。我以前使用过 MSIPackage,但它适用于单个文件。我如何指定这组文件?我很想创建一个新的 MSI,其中包含来自第三方的 MSI 以及其他文件,但最终我安装了一些虚拟程序,这实际上不是我想要的。

在此先感谢您的帮助。

编辑解决方案

非常感谢汤姆提供了解决这个问题的钥匙。对于那些好奇的人,这里是我在 WiX 3.8 中用于解决此问题的代码和步骤。

首先收获存储第三方安装程序的目录。

"%WIX%bin\heat.exe" dir "$(ProjectDir)..\ThirdParty\AppDirectory" -dr Dir_AppName -cg PAYGROUP_AppName -ag -sreg -scom -srd -var "var.AppNameDir" -t "$(ProjectDir)\ComponentToPayload.xsl" -out "$(ProjectDir)AppNamePayloadGroup.wxs"
Run Code Online (Sandbox Code Playgroud)

其中AppNameDir是引用应用程序安装文件位置的预处理器变量。

我的转换文件与 Tom 链接的文件略有不同,但差别不大。我在原来的 heat 文件中创建了一个组件组,然后将其用作我的 PayloadGroup,而不是 DirectoryRef。

<xsl:stylesheet version="1.0"
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:wix="http://schemas.microsoft.com/wix/2006/wi"
  xmlns="http://schemas.microsoft.com/wix/2006/wi">

  <xsl:template match="/">
    <Wix>
      <Fragment>
        <xsl:apply-templates select="*" />
      </Fragment>
    </Wix>
  </xsl:template>

  <xsl:template match="//wix:ComponentGroup">
    <PayloadGroup>
      <xsl:attribute name="Id">
        <xsl:value-of select="@Id"/>
      </xsl:attribute>
      <xsl:apply-templates select="*" />
    </PayloadGroup>
  </xsl:template>

  <xsl:template match="//wix:File">
    <Payload>
      <xsl:attribute name="SourceFile">
        <xsl:value-of select="@Source"/>
      </xsl:attribute>
    </Payload>
  </xsl:template>

</xsl:stylesheet>
Run Code Online (Sandbox Code Playgroud)

然后我为该组件创建了一个片段并引用了 Payload 组

  <Fragment>
    <PackageGroup Id="PCKGRP_AppName">
      <MsiPackage
        SourceFile="$(var.AppNameDir)\app.msi">
        <MsiProperty Name="PropertyName1" ="Value1"/>
        <MsiProperty Name="PropertyName2" ="Value2"/>
        <MsiProperty Name="PropertyName3" ="Value3"/>
        <PayloadGroupRef Id="PAYGROUP_AppName"/>
      </MsiPackage>
    </PackageGroup>
  </Fragment>
Run Code Online (Sandbox Code Playgroud)

然后最后引用链中的组

    <Chain>
...
      <PackageGroupRef Id="PCKGRP_AppName"/>
...
    </Chain>   
Run Code Online (Sandbox Code Playgroud)

Tom*_*get 4

在 MsiPackage 元素内部使用一堆 Payload 元素(或者将有效负载放在其他地方并使用 PayloadGroupRef

作为补偿,您的引导程序可能会获得更好的压缩,因为 MsiPackage 开始爆炸,因为双重压缩在时间和空间上可能效率低下。