如何从WiX安装程序中的其他地方引用heat.exe生成的收获中引用文件?

时间:2016-12-08 21:46:07

标签: installation wix windows-installer installer

我使用WiX Toolset编写了新的安装程序。似乎最佳做法是使用heat.exe应用程序运行构建的应用程序文件并自动生成引用以包含在安装程序中。这很好,但我发现通过使用这种技术,除了将它们复制到安装目录之外,你几乎可以阻止这些文件在其他任何文件中有用。这是因为我似乎无法参考"这些文件用于其他事情。例如。我希望将其中一个文件作为服务安装,但 ServiceInstall 机制似乎不允许您使用收获中引用的内容。另外,我的一个文件是一个XML文件,我想根据用户在安装过程中的输入进行修改。同样,我似乎无法在收获中引用此文件,以便在 XmlConfig 机制中使用。

我已经看过这个post,但所选择的答案并没有真正提供一个例子。要启动,WiX编译器不允许你放置#'#'标识符字段中的符号,因为它是"不是合法标识符"作为答案帖子声称。如果您使用收获中的普通ID,它会抱怨它们已经存在。

这是我收获的.wxs文件的片段。

<!-- Xml file I'd like to modify during install -->
<Component Id="cmp78CF3591818BB6F883096F2C98654BA9" Guid="*">
    <File Id="fil1532F0BC6EDCE81B25489D872A72339A" KeyPath="yes" Source="$(var.MyApplication.TargetDir)\log.config" />
</Component>

<!-- ... -->

<!-- Application I'd like to install as a service -->
<Component Id="cmp84F0EA671F93094E33AE84FA2A03BA2E" Guid="*">
    <File Id="filD4A27A27D20D3D734B279B4F21754836" KeyPath="yes" Source="$(var.MyApplication.TargetDir)\MyService.exe" />
</Component>

对于服务安装,我觉得直观的方式是这样的:

<Component Id="cmp84F0EA671F93094E33AE84FA2A03BA2E">
    <File Id="filD4A27A27D20D3D734B279B4F21754836" />
    <ServiceInstall
      Id="MyServiceID"
      Name="MyService"
      Type="ownProcess"
      Start="auto"
      ErrorControl="normal"
      Interactive="no">
    </ServiceInstall>
    <ServiceControl Name="MyService" Id="MyServiceControl" Start="install" Stop="both" Remove="uninstall" Wait="yes"/>
</Component>

但当然这不起作用,因为它声称ID是重复的。我猜他们是,但我怎么能说&#34;你知道那个文件&#39; X&#39;在收获中......你,我想安装它作为服务。&#34;我已经能够使安装工作,但我必须从收获中过滤MyService.exe并手动添加它。现在,如果每次你真的喜欢用某个特定文件做某事,那么我想我可能只是忘记使用愚蠢的heat.exe技术并手动输入每个文件。那么从hot.exe收获中引用文件的语法究竟是什么?

2 个答案:

答案 0 :(得分:3)

最简单的答案:不要使用Heat.exe为需要特殊处理的文件(如服务)生成创作。从收获中排除这些文件(如果需要,使用登台目录)。

答案 1 :(得分:0)

Heat为您生成了组件定义。将ServiceInstall元素放在harvest.wxs中的组件内。您的新代码段如下所示:

<!-- Application I'd like to install as a service -->
<Component Id="cmp84F0EA671F93094E33AE84FA2A03BA2E" Guid="*">
    <File Id="filD4A27A27D20D3D734B279B4F21754836" KeyPath="yes" Source="$(var.MyApplication.TargetDir)\MyService.exe" />
    <ServiceInstall
      Id="MyServiceID"
      Name="MyService"
      Type="ownProcess"
      Start="auto"
      ErrorControl="normal"
      Interactive="no">
    </ServiceInstall>
    <ServiceControl Name="MyService" Id="MyServiceControl" Start="install" Stop="both" Remove="uninstall" Wait="yes"/>
</Component>