2

我以前用过...

<?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 文件,但我知道这不是真的,因为如果我设置PRODUCTVERSION="1.0.0.0"然后安装程序构建和所有这些文件安装正确。

我怎样才能bind.FileVersion“看到”MyLibrary.dll?

编辑

如果我使用 Source.wxs 中的非人类友好文件 ID(见下文),我可以让它工作,但这真的是最好的解决方案吗?

  <?define PRODUCTVERSION="!(bind.fileVersion.fil023E197261ED7268770DDE64994C4A55)" ?>
4

2 回答 2

4

SuppressUniqueIds切换到更容易,您也可以在文档true中看到这一点。结果,您的 Id 中将有一个文件名而不是 GUID。

于 2015-08-24T08:53:02.960 回答
2

您可以使用 XSL 编辑 Heat 生成的输出。这样,您可以将 IDfil023E197261ED7268770DDE64994C4A55转换为更易读的东西,可以在您的项目中引用。要将转换应用于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 任务的文档。

于 2014-04-25T08:46:24.047 回答