我以前用过......
<?define PRODUCTVERSION="!(bind.FileVersion.MyLibrary.dll)" ?>
...定义在我的安装程序中使用的版本变量。我第一次使用Heat.exe将我在安装程序中需要的文件/文件夹(包括MyLibrary.dll)收集到名为Source.wxs的文件中。
如果我尝试构建安装程序,则会收到以下错误:
Unresolved bind-time variable !(bind.FileVersion.MyLibrary.dll)
就像宣布PRODUCTVERSION
的Product.wxs文件一样,看不到包含MyLibrary.dll详细信息的Source.wxs文件,但我知道这不是&# 39;如果我设置PRODUCTVERSION="1.0.0.0"
,那么安装程序将构建并正确安装所有这些文件。
如何让bind.FileVersion
看到&#39; MyLibrary.dll?
修改
如果我使用来自Source.wxs的非人类友好文件ID(见下文),我可以让它工作,但这真的是最好的解决方案吗?
<?define PRODUCTVERSION="!(bind.fileVersion.fil023E197261ED7268770DDE64994C4A55)" ?>
答案 0 :(得分:4)
将SuppressUniqueIds
切换为true
要容易得多,您也可以在documentation中看到这一点。
因此,您的Id中将有一个文件名而不是GUID。
答案 1 :(得分:1)
您可以使用XSL编辑Heat生成的输出。这样,您可以将ID fil023E197261ED7268770DDE64994C4A55
转换为更易读的内容,可以在项目中引用。要将转换应用于HeatDirectory
任务,您必须指定其Transforms
属性,并将其值设置为您必须创建的XSL文件的文件名。
在那个XSL文件中,你必须操纵由heat生成的XML。要重命名Id
元素的File
属性,您可以使用以下代码:
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet
version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:wix="http://schemas.microsoft.com/wix/2006/wi"
xmlns:msxsl="urn:schemas-microsoft-com:xslt"
exclude-result-prefixes="msxsl">
<xsl:template match="//wix:File">
<xsl:variable name="FilePath" select="@Source" />
<xsl:variable name="FileName" select="substring-after($FilePath,'\')" />
<xsl:copy>
<xsl:attribute name="Id">
<xsl:choose>
<xsl:when test="contains($FileName,'\')">
<xsl:value-of select="substring-after($FileName,'\')"/>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="$FileName"/>
</xsl:otherwise>
</xsl:choose>
</xsl:attribute>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
在w3schools阅读有关XSL的信息,并查看HeatDirectory task的文档。