WiX编译时间目录收获和变量

时间:2014-03-11 17:30:21

标签: wix windows-installer

我对这些工具的互动感到有些困惑,我需要一点帮助熨平我的appraoch(或被告知我很愚蠢)。

我有一个带有两个WiX项目的VS2010解决方案。我在解决方案文件夹中有一个.WXI文件,其中包含我想在多个项目中使用的多个全局变量(将来会添加更多)。

我使用标准语法将.WXI文件包含在我的主Product.wxs项目中:

<?include ..\Shared\Common.wxi?>

这很有效,所有变量都可用。但是,作为此构建过程的一部分,我还需要运行heat.exe,以便在每次重建时自动生成一个大片段。

我使用这样的命令:

"Heat.exe" dir %sourcedir% -sfrag -sreg -suid -gg -ke -template fragment -out %wixfile% -dr INSTALLFOLDER -cg MyInstall -var var.MyFileSource

在我的包含变量文件中,我有:

<?define MyFileSource= "$(var.SolutionDir)..\..\..\..\mydir\bindist" ?>

但是我收到这样的错误:

Undefined preprocessor variable '$(var.MyFileSource)'.

正如您所期望的那样,片段文件不包含引用文件Common.wxi的行,但问题是这个片段文件将在编译之前被替换为每个构建,因此手动编辑此文件是完全不实际的片段,以便每次添加它(更不用说无论如何)。

我的问题是我完全错误地接近这个吗?如果没有,那么使这种方法正常工作的最佳方法是什么?

令人困惑的是,-var开关在片段文件中创建了一个变量引用,但没有办法从包含文件中启用变量引用(除非我错过了文档中的某个地方) )。

2 个答案:

答案 0 :(得分:2)

您可以为wxi提供所需的变量,而不是将变量放在单独的candle.exe文件中并将其包含在所有可能的位置。您可以从命令行(使用-dVarName=VarValue语法)或任何受支持的构建工具NAnt或MSBuild执行此操作。

我可以看到以下优点:

  • WiX创作不会受到<?include?>内容和
  • 的污染
  • 你不必弄乱热量收获的作者
  • 从命令行定义一次的变量可在项目的任何wxs文件中找到

答案 1 :(得分:0)

我还有一个包含文件,可以在构建期间集中我的配置。由于我也在热量产生的文件中使用变量,这非常方便,因为我只需要定义一次 为了能够在热输出中使用这些变量,您可以使用xslt变换转换由热量创建的输出。只需将-t myTransformFile.xslt添加到热量命令行,这样输出就会根据myTransformFile.xslt中定义的样式表进行转换。

myTransformFile.xslt - 文件中添加以下内容,它基本上会复制所有内容并添加Include - 指令:

    <?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="http://schemas.microsoft.com/wix/2006/wi"
        exclude-result-prefixes="wix">

        <xsl:template match="wix:Wix">
          <xsl:copy>
            <!-- The following enters the directive for adding the Common.wxi include file to the dynamically generated file -->
            <xsl:processing-instruction name="include">$(sys.CURRENTDIR)..\Shared\Common.wxi</xsl:processing-instruction>
            <xsl:apply-templates select="@*" />
            <xsl:apply-templates />
          </xsl:copy>
        </xsl:template>

        <xsl:template match="@*|node()">
          <xsl:copy>
            <xsl:apply-templates select="@*|node()" />
          </xsl:copy>
        </xsl:template>

    </xsl:stylesheet>

您必须调整Common.wxi的路径,以便在构建时找到它。

编辑:忘记了复制其他元素的XSLT文件的一部分。