我对这些工具的互动感到有些困惑,我需要一点帮助熨平我的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
开关在片段文件中创建了一个变量引用,但没有办法从包含文件中启用变量引用(除非我错过了文档中的某个地方) )。
答案 0 :(得分:2)
您可以为wxi
提供所需的变量,而不是将变量放在单独的candle.exe
文件中并将其包含在所有可能的位置。您可以从命令行(使用-dVarName=VarValue
语法)或任何受支持的构建工具NAnt或MSBuild执行此操作。
我可以看到以下优点:
<?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文件的一部分。