文件表(MSI文件中)中的AFAIK文件序列影響卸載/安裝所需的時間:如果具有相同目標目錄的文件條目按順序放置在File表中,則安裝程序執行卸載/安裝所需的時間少於當這些文件分散在File表中時。如何在WiX中對文件序列進行排序?
但是,似乎我的wix項目中構建的安裝程序是在後一種情況下。它的文件條目分散在File表中。有沒有辦法對這些文件條目進行排序,以便它們按順序放置在File表中? (我的.wxs文件由heat.exe生成)
謝謝。
文件表(MSI文件中)中的AFAIK文件序列影響卸載/安裝所需的時間:如果具有相同目標目錄的文件條目按順序放置在File表中,則安裝程序執行卸載/安裝所需的時間少於當這些文件分散在File表中時。如何在WiX中對文件序列進行排序?
但是,似乎我的wix項目中構建的安裝程序是在後一種情況下。它的文件條目分散在File表中。有沒有辦法對這些文件條目進行排序,以便它們按順序放置在File表中? (我的.wxs文件由heat.exe生成)
謝謝。
加熱工具提供了在加熱結束時運行自定義XSLT轉換的功能。這是一個非常強大的功能,因爲它可以讓您根據結果執行任何操作。例如,以下XSL會將文件ID更改爲所有父文件夾+文件名的拼接。
<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:File'>
<xsl:variable name='fileId'>
<xsl:value-of select="/wix:Wix/wix:Fragment/wix:DirectoryRef/@Id"/>_<xsl:value-of select="translate(substring-after(@Source, '\'), '\- ', '_')"/>
</xsl:variable>
<xsl:copy>
<xsl:apply-templates select="@*"/>
<xsl:attribute name="Id">
<xsl:value-of select="$fileId"/>
</xsl:attribute>
</xsl:copy>
</xsl:template>
<xsl:template match='wix:Directory'>
<xsl:variable name='parentPath'>
<xsl:for-each select='ancestor::wix:Directory/@Name'>
<xsl:value-of select="concat(.,'_')"/>
</xsl:for-each>
</xsl:variable>
<xsl:copy>
<xsl:apply-templates select="@*"/>
<xsl:attribute name="Id">
<xsl:value-of select="/wix:Wix/wix:Fragment/wix:DirectoryRef/@Id"/>_<xsl:value-of select="translate($parentPath, '- ', '__')"/><xsl:value-of select="translate(@Name, '- ', '__')"/>
</xsl:attribute>
<xsl:apply-templates select="*"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
這種方法不能保證ID的唯一性,但對我來說工作得很好。
WiX工具集沒有內置任何特定的方式進行排序。但是,如果您有經驗證據顯示應該使用更好的排序算法,那麼發送到[email protected]郵件列表將是一件好事。 WiX工具集應該自動進行最佳優化。
HACK:您可以嘗試按字母順序排序您的File/@Id
以控制當前版本的WiX工具集的順序。這可能會或可能不適用於所有版本的WiX工具集。
我希望heat.exe可以在文件/ @ Id中包含父目錄名稱,如書籍WiX:Windows Installer XML開發人員指南第2章中的建議。我用太多的文件手動編寫它們的ID。 – sky
您可以通過使用XSLT來獲取此信息。由於XSL轉換可能相當複雜,因此只需要一些體操。 :) –
謝謝你的好代碼。 :)它運作良好,我定製它爲我的使用。 – sky