我有一个供应商提供给我的第三方MSI。但是,MSI并不孤立,它需要多个支持文件(dll,配置文件,设备驱动程序......)才能完成安装。我尝试在MSI目录中没有这些文件的情况下进行安装,并在安装过程中抱怨丢失的文件。在我看来,这是一种构建安装程序的奇怪方法。无论如何,我想捆绑这个"安装"被烧伤消耗。我之前使用过MSIPackage,但这适用于单个文件。我该如何指定这组文件?我很想制作一个新的MSI,其中包括来自第三方的MSI以及其他文件,但后来我最终安装了一些幻像程序,这真的不是我想要的。
提前感谢您的帮助。
使用解决方案进行编辑:
非常感谢Tom提供此问题的关键。对于那些好奇的人来说,我在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"
其中 AppNameDir 是一个引用应用程序安装文件位置的预处理器变量。
我的转换文件与Tom链接的文件略有不同,但并不多。我在我的原始热文件中创建了一个组件组,然后将其用作我的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>
然后我为组件创建了一个片段并引用了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>
然后最后引用链中的组
<Chain>
...
<PackageGroupRef Id="PCKGRP_AppName"/>
...
</Chain>
答案 0 :(得分:3)
在MsiPackage元素内部使用一堆Payload元素(或将有效负载放在别处并使用PayloadGroupRef)。
补偿一下,由于MsiPackage开始爆炸,你的引导程序可能会得到更好的压缩,因为双倍压缩在时间和空间上都是低效的。
答案 1 :(得分:1)
万分感谢这个答案。在其他帖子的帮助下(尤其是这个one),我想出了xslt,还包括Name属性(带子文件夹)和条带空行。
<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:strip-space elements="*"/>
<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>
<xsl:attribute name="Name">
<xsl:call-template name="string-replace-all">
<xsl:with-param name="text" select="@Source"/>
<xsl:with-param name="replace" select="'$(var.SourceDir)\'"/>
<xsl:with-param name="by" select="''"/>
</xsl:call-template>
</xsl:attribute>
</Payload>
</xsl:template>
<xsl:template name="string-replace-all">
<xsl:param name="text" />
<xsl:param name="replace" />
<xsl:param name="by" />
<xsl:choose>
<xsl:when test="contains($text, $replace)">
<xsl:value-of select="substring-before($text,$replace)" />
<xsl:value-of select="$by" />
<xsl:call-template name="string-replace-all">
<xsl:with-param name="text"
select="substring-after($text,$replace)" />
<xsl:with-param name="replace" select="$replace" />
<xsl:with-param name="by" select="$by" />
</xsl:call-template>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="$text" />
</xsl:otherwise>
</xsl:choose>
</xsl:template>
</xsl:stylesheet>
我希望这可以帮助您自动化Wix bootstapper构建。