将heat.exe用于WindowsVolume中的文件 - GUID问题

时间:2014-07-10 16:26:19

标签: wix installer windows-installer heat

我搜索了SO和Google的一些时间,但我没有找到相关的问题。所以希望这个问题不会重复。

对于我的客户,我使用WiX创建安装程序工件。某些文件已安装到

[WindowsVolume]\tool\scripts. 

只要我手动将这些文件添加到相应的WiX片段,就可以了。由于最近经常移动和删除此组件的文件,我决定通过来自subversion的heat.exe获取它们。我面临的一个问题是,热量的-ag开关拒绝在[WindowsVolume]上工作 - 我想因为只要到组件目录的路径保持不变,-ag就会使GUID保持静态相同。因此,我使用-gg在每次加热过程中生成新的GUID。测试人员现在报告文件没有被替换,文件夹根本没有创建。

通过设置-ag开关使用自动生成的GUID我从光源中收到以下错误消息:

C:\checkouts\project\Setup\tool.fragment.wxs(41,0): error LGHT0231: 
The component 'cmpF69984FE7B4A36DD402E57B30E416ACB' has a key file with path 
'TARGETDIR\indexes\arbitrary.file'.  Since this path is not rooted in one of 
the standard directories (like ProgramFilesFolder), this component does not 
fit the criteria for having an automatically generated guid.  (This error may 
also occur if a path contains a likely standard directory such as nesting a 
directory with name "Common Files" under ProgramFilesFolder.)

在WiX中,我有一个主要的.wxs定义文件夹,功能和InstallExecuteSequence。相关的文件夹定义是:

<Directory Id="TARGETDIR" Name="SourceDir">
  <Directory Id="ToolFolder">
    <Directory Id="ToolScriptsFolder" Name="scripts"/>
  </Directory>
</Directory>

<SetDirectory Id="ToolFolder" Value="[WindowsVolume]tool" />

收获的碎片是:

<?xml version="1.0" encoding="utf-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
  <Fragment>
    <DirectoryRef Id="ToolScriptsFolder" />
  </Fragment>

  <Fragment>
    <ComponentGroup Id="CG_ToolScripts">
        <Component Id="cmp2BCA6A75C5C234BEF6FAD9FC41C4B661" 
                   Directory="ToolScriptsFolder" Guid="*">
            <File Id="fil8C1ADEFF76E859B93A97C72A95365E90" 
                  KeyPath="yes" Source="$(var.ToolScripts)\arbitrary.file" />
        </Component>
    </ComponentGroup>
  </Fragment>
</Wix>

知道如何在不将工具\脚本移动到[ProgramFiles]的情况下使自动生成的GUID正常工作吗?任何帮助我免于手动编辑片段的帮助表示赞赏:)提前致谢!

1 个答案:

答案 0 :(得分:1)

由于我没有找到解决方案,因此我实施了一种解决方法。为了防止将来有人遇到类似的问题,这就是诀窍:

  1. 检查注册表以获取先前安装所安装的脚本目录
  2. 添加RemoveFolderEx自定义操作以删除在先前安装期间写入注册表的目录
  3. 将脚本的目录写入注册表以便在下次安装期间进一步使用
  4. 在代码中看起来有点像:

    <Property Id="LAST_KNOWN_SCRIPTS_LOCATION">
      <RegistrySearch Key="SOFTWARE\vendor\product" Root="HKLM" Type="raw" Id="APPLICATIONFOLDER_REGSEARCH" Name="scriptsLocation" />
    </Property>
    
    <SetProperty Id="LAST_KNOWN_SCRIPTS_LOCATION" Value="some\default\directory" Before="AppSearch"><![CDATA[LAST_KNOWN_SCRIPTS_LOCATION]]></SetProperty>
    
    <DirectoryRef Id="ToolScriptsFolder">
      <Component Id="cmp2EB940FB7EFA4691AD58C7AE293A529E" Guid="ED4252705A824BD19441C5574CC99E67">
        <RegistryValue Root="HKLM" Key="SOFTWARE\vendor\product\scriptsLocation" Value="[ToolScriptsFolder]" Type="string" KeyPath="yes"/>
        <util:RemoveFolderEx Id="rmfx_ScriptsFolder" On="both" Property="LAST_KNOWN_SCRIPTS_LOCATION"/>
      </Component>
    </DirectoryRef>