使用Heat收获时如何使用bind.FileVersion?

时间:2014-04-23 12:28:30

标签: wix heat wix3.8

我以前用过......

<?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)" ?>

2 个答案:

答案 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的文档。