2014-11-17 2 views
3

У меня есть сторонний MSI, который был предоставлен мне поставщиком. Однако MSI не стоит в одиночку, для завершения установки требуется несколько файлов поддержки (DLL, файлы конфигурации, драйверы устройств ...). Я попытался установить без этих файлов, присутствующих в каталоге с MSI, и он жалуется на недостающие файлы во время установки. Кажется, это странный способ создания установщика. Во всяком случае, я хотел бы объединить эту «установку», которая будет использоваться Burn. Раньше я использовал MSIPackage, но это работает для одного файла. Как я могу указать эту группу файлов? Я испытываю соблазн создать новую MSI, которая включает MSI от третьего лица плюс дополнительные файлы, но затем я получаю установленную фантомную программу, которая действительно не то, что я хочу.Bundle несколько файлов поддержки для WiX Burn

Заранее за вашу помощь.

EDIT с раствором:

Большое спасибо Тому за ключи к этой проблеме. Для тех, кому интересно, это код и шаги, которые я использовал для решения этой проблемы в 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 является переменным препроцессором, ссылающегося расположение установочных файлов приложения.

Мой файл преобразования немного отличался от того, который был связан с Томом, но не так много. Я создал группу компонентов в своем исходном файле тепла, а затем использовал это как мою 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> 
+1

Спасибо за решение. Добавление к xsl дает более чистый результат. – Herman

ответ

3

Внутри элемента MsiPackage использовать связку элементов полезной нагрузки (или размещать полезную нагрузку в другом месте и использовать PayloadGroupRef).

В качестве компенсации ваш загрузчик может получить лучшее сжатие, так как MsiPackage начинает взорваться, потому что двойное сжатие может быть неэффективным со временем и пространством.

+0

Отличное предложение, оно открыло мне несколько новых дверей. Знаете ли вы, может ли тепло действительно собирать каталог для создания группы полезных нагрузок. Я попробовал переключатели «Generate payloadgroup», но все, что я выбрал, было компонентами. –

+1

На выходе будет производиться преобразование XSL. См. «FilesToPayloads.xsl» в этом [ответе] (http://stackoverflow.com/a/26812244/2226988). –

+0

Спасибо за вашу помощь, я включил предложения, и это сработало хорошо. Отредактировано оригинальное сообщение, чтобы показать мой новый код. –

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.