Установщик WiX: использование xslt с heat.exe для обновления атрибутов
Я пытаюсь создать установщик WiX для службы Windows, и я прочитал, что я решил установить keyPath для "no" для всех моих файлов, за исключением .exe в моем WiX script.
В настоящее время я создаю свой каталог и файловую структуру, используя Heat.exe, вот моя команда:
"$(WIX)bin\heat.exe" dir $(SolutionDir)EmailGenerationService\bin\PROD
-cg EmailGenFiles -gg -scom -sreg -sfrag -srd -suid
-dr INSTALLLOCATION -var var.FileSource
-t $(Projectdir)KeyPathTransform.xslt
-out $(ProjectDir)DirectoryAndFileComponents.wxs
Я намерен обновить все элементы файла Keypath = "no" в файле DirectoryAndFileComponents.wxs.
Образец выхода из тепла:
<?xml version="1.0" encoding="utf-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
<Fragment>
<DirectoryRef Id="INSTALLLOCATION">
<Component Id="Dollar.Common.dll" Guid="{2BCD0767-2383-47CF-B1BF-325FA4A3264F}">
<File Id="Dollar.Common.dll" KeyPath="yes" Source="$(var.FileSource)\Dollar.Common.dll" />
</Component>
<Component Id="Dollar.Common.Exceptions.dll" Guid="{B7238091-76D1-42F5-A3B4-A539DFF3BD92}">
<File Id="Dollar.Common.Exceptions.dll" KeyPath="yes" Source="$(var.FileSource)\Dollar.Common.Exceptions.dll" />
</Component>
<Component Id="Dollar.Common.Exceptions.pdb" Guid="{43711979-747D-49C9-BAE4-ECD44FAF5E67}">
<File Id="Dollar.Common.Exceptions.pdb" KeyPath="yes" Source="$(var.FileSource)\Dollar.Common.Exceptions.pdb" />
</Component>
<Component Id="Dollar.Common.Logging.dll" Guid="{59F9ABF3-5F68-410C-BC96-0556282F1E04}">
<File Id="Dollar.Common.Logging.dll" KeyPath="yes" Source="$(var.FileSource)\Dollar.Common.Logging.dll" />
</Component>
Вот XSLT, который я перехожу на тепло, чтобы выполнить преобразование:
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:msxsl="urn:schemas-microsoft-com:xslt"
exclude-result-prefixes="msxsl"
xmlns:wix="http://schemas.microsoft.com/wix/2006/wix"
xmlns:my="my:my">
<xsl:output method="xml" indent="no"/>
<xsl:strip-space elements="*"/>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match='/wix:Wix/wix:Fragment/wix:DirectoryRef/wix:Component/wix:File[@Id and not (@Id="EmailGenerationService.exe")]'>
<xsl:attribute name="KeyPath">
<xsl:value-of select="no"/>
</xsl:attribute>
</xsl:template>
</xsl:stylesheet>
Я испробовал немало вариантов этого, основываясь на других сообщениях на этом сайте, а еще где, но пока не смог получить файл, созданный heat.exe, чтобы KeyPath = "no" .
Я пропустил что-то очевидное?
Ответы
Ответ 1
У вас есть разные определенные пространства имен:
- В XML: _
http://schemas.microsoft.com/wix/2006/wi
- В XSLT:
http://schemas.microsoft.com/wix/2006/wix
Как я знаю, правильное пространство имен для WiX http://schemas.microsoft.com/wix/2006/wi
. Поэтому вы должны исправить свой XSLT.
XSLT:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:msxsl="urn:schemas-microsoft-com:xslt"
exclude-result-prefixes="msxsl"
xmlns:wix="http://schemas.microsoft.com/wix/2006/wi"
xmlns:my="my:my">
<xsl:output method="xml" indent="yes" />
<xsl:strip-space elements="*"/>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match='wix:Wix/wix:Fragment/wix:DirectoryRef/wix:Component/wix:File[@Id and not (@Id = "EmailGenerationService.exe")]'>
<xsl:copy>
<xsl:apply-templates select="@*"/>
<xsl:attribute name="KeyPath">
<xsl:text>no</xsl:text>
</xsl:attribute>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
Входной XML:
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
<Fragment>
<DirectoryRef Id="INSTALLLOCATION">
<Component Id="Dollar.Common.dll" Guid="{2BCD0767-2383-47CF-B1BF-325FA4A3264F}">
<File Id="Dollar.Common.dll" KeyPath="yes" Source="$(var.FileSource)\Dollar.Common.dll" />
</Component>
<Component Id="Dollar.Common.Exceptions.dll" Guid="{B7238091-76D1-42F5-A3B4-A539DFF3BD92}">
<File Id="Dollar.Common.Exceptions.dll" KeyPath="yes" Source="$(var.FileSource)\Dollar.Common.Exceptions.dll" />
</Component>
<Component Id="Dollar.Common.Exceptions.pdb" Guid="{43711979-747D-49C9-BAE4-ECD44FAF5E67}">
<File Id="Dollar.Common.Exceptions.pdb" KeyPath="yes" Source="$(var.FileSource)\Dollar.Common.Exceptions.pdb" />
</Component>
<Component Id="Dollar.Common.Logging.dll" Guid="{59F9ABF3-5F68-410C-BC96-0556282F1E04}">
<File Id="Dollar.Common.Logging.dll" KeyPath="yes" Source="$(var.FileSource)\Dollar.Common.Logging.dll" />
</Component>
</DirectoryRef>
</Fragment>
</Wix>
Выходной XML:
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
<Fragment>
<DirectoryRef Id="INSTALLLOCATION">
<Component Id="Dollar.Common.dll" Guid="{2BCD0767-2383-47CF-B1BF-325FA4A3264F}">
<File Id="Dollar.Common.dll" Source="$(var.FileSource)\Dollar.Common.dll" KeyPath="no" />
</Component>
<Component Id="Dollar.Common.Exceptions.dll" Guid="{B7238091-76D1-42F5-A3B4-A539DFF3BD92}">
<File Id="Dollar.Common.Exceptions.dll" Source="$(var.FileSource)\Dollar.Common.Exceptions.dll" KeyPath="no" />
</Component>
<Component Id="Dollar.Common.Exceptions.pdb" Guid="{43711979-747D-49C9-BAE4-ECD44FAF5E67}">
<File Id="Dollar.Common.Exceptions.pdb" Source="$(var.FileSource)\Dollar.Common.Exceptions.pdb" KeyPath="no" />
</Component>
<Component Id="Dollar.Common.Logging.dll" Guid="{59F9ABF3-5F68-410C-BC96-0556282F1E04}">
<File Id="Dollar.Common.Logging.dll" Source="$(var.FileSource)\Dollar.Common.Logging.dll" KeyPath="no" />
</Component>
</DirectoryRef>
</Fragment>
</Wix>
Ответ 2
Я не буду отвечать на ваш первоначальный вопрос.:)
Я прочитал, что я решил установить keyPath для "no" для всех моих файлов, за исключением .exe
Я думаю, вы были введены в заблуждение. В действительности таблица ServiceInstall имеет столбец Component_
и в соответствии с MSDN:
чтобы установить эту службу, используя таблицу InstallService, KeyPath для этого компонента должен быть исполняемый файл для службы.
Это не означает, что файлы non-exe в других компонентах должны иметь @KeyPath='no'
. Он просто говорит, что EXE файл службы должен находиться в отдельном компоненте и должен быть ключевым путем.
Ключевой путь - очень важная концепция технологии MSI. Вы можете прочитать об этом здесь, см. Описание столбца KeyPath.
Теперь, если мы вернемся к вашему первоначальному вопросу - нет, вам не нужно настраивать тепловую мощность так, как вы упомянули. По умолчанию будет создано создание WiX по умолчанию.
Ответ 3
Можно ли предложить другой подход?
<xsl:template match="@KeyPath[parent::wix:File[parent::wix:Component[parent::wix:DirectoryRef[parent::wix:Fragment[parent::wix:Wix]]]] and . != 'EmailGenerationService.exe']">
<xsl:attribute name="KeyPath">
<xsl:value-of select="'no'"/>
</xsl:attribute>
</xsl:template>
Просто измените соответствие шаблона выше, и вы должны иметь правильный результат.