如何在WiX中加热空目录?

时间:2017-03-24 03:54:17

标签: wix

这是cakebuild脚本:

  WiXHeat(Directory("../Release"), new FilePath("./xxx/Files.wxs"), WiXHarvestType.Dir, new HeatSettings
  {
    AutogeneratedGuid = true,
    ComponentGroupName = "Binaries",
    Transform = "./Filter.xslt",
    SuppressCom = true,
    SuppressFragments = true,
    SuppressRegistry = true,
    SuppressRootDirectory = true,
    PreprocessorVariable = "var.xxx.TargetDir",
    DirectoryReferenceId = "INSTALLFOLDER",
    WorkingDirectory = "./xxx_Installer",
    KeepEmptyDirectories = true,
    GenerateGuid = true,
  });

它使用参数:-ke -ag -gg。

Files.wxs看起来像:

<?xml version="1.0" encoding="utf-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
    <Fragment>
        <DirectoryRef Id="INSTALLFOLDER">
            <Directory Id="dir76A8B56EDC1C4DD3CB4177F3704BC91E" Name="data">
                <Component Id="cmpE375532277DA492834892BE47B02E5DA" Guid="*" KeyPath="yes">
                    <CreateFolder />
                </Component>
            </Directory>
        </DirectoryRef>
    </Fragment>
    <Fragment>
        <ComponentGroup Id="Binaries">
            <ComponentRef Id="cmpE375532277DA492834892BE47B02E5DA" />
        </ComponentGroup>
    </Fragment>
</Wix>

然后Light不能与Files.wxs一起使用,这是错误:

  

... \ Files.wxs(29):错误LGHT0230:Component / @ Guid属性   值'*'对此组件无效,因为它不符合   拥有自动生成guid的标准。组件   使用Directory作为KeyPath或包含ODBCDataSource子   元素不能使用自动生成的guid。确保你的   组件没有KeyPath的目录并移动任何   ODBCDataSource子元素到具有显式组件的组件   的GUID。执行任务'BuildInstaller'时发生错误。错误:   Light:进程返回错误(退出代码230)。

似乎对于空目录,它必须有一个指定的公会,而不是this article的“*”。

我不想手动用GUID替换“*”,因为热/光过程与构建过程集成,而Files.wxs在源代码控制中。

您知道如何解决此错误吗?

2 个答案:

答案 0 :(得分:2)

您同时使用热参数-ag和-gg。

我错过了什么或

  

-ag - 在编译时自动生成组件guid,例如设置Guid =“*”。

     

-gg - 现在生成guid。当热量运行时,所有组件都有一个guid。

     

来源http://wixtoolset.org/documentation/manual/v3/overview/heat.html

不能同时满足。

因为你的灯光在GUID生成期间失败了,我建议只尝试 -gg 而不用 -ag 。这也帮助了我的空目录。

答案 1 :(得分:1)

我添加了这个片段,WiX Light工作正常。

  <xsl:template match="wix:Directory[@Name='data']/wix:Component/@Guid">
    <xsl:attribute name="Guid">
      <xsl:value-of select="'E8A26678-FA90-4BFC-846F-4E79AE55D44D'"/>
    </xsl:attribute>
  </xsl:template>

如果这是正确的解决方案,请发表评论。