如何使用heat.exe生成片段后,如何自动将ComponentGroupRefs添加到功能中

时间:2017-06-06 16:35:38

标签: wix

我需要使用文本文件中包含的文件列表动态创建安装程序。

文件列表包含来自许多不同目录的单个文件,并且很容易定期更改。我正在尝试创建一个安装程序,每次创建新版本的文件列表时都不需要更新。

到目前为止,我从cmd脚本中的命令行调用heat.exe,我在其中使用for循环遍历文件列表,对每个文件运行heat命令以创建组件的片段。

FOR /F "delims=;"  %%a IN (FileList.txt) DO (heat.exe file "%%a" -cg ComponentGroupName -gg -g1 -sfrag -dr DirectoryName %%~da -out "%~dp0%%~na.wxs")

显然,这段代码会给每个ComponentGroup提供相同的名称,这会带来一个问题,但我可以通过使用组件组名称中的文件名来解决这个问题。

我正在努力解决的问题是如何将组件组的名称添加到Project.wsx文件中的要素元素中。

我已阅读了 Wix Toolset Documentation Manual以及书籍WiX 3.6: A Developer's Guide to Windows Installer XML中的相关章节,但无法了解如何执行此操作。

我很欣赏我可以使用某种形式的文本替换来实现这一点,但我希望Wix工具集中内置了一些东西,因为我不能成为第一个需要动态创建热量生成组件的人。

1 个答案:

答案 0 :(得分:1)

我想出了一个可接受的问题解决方案。 我正在做的是运行cmd文件来生成热量组件。这些组件中的每一个都存储在它自己的componentGroup中,由id" ComponentGroup" +文件列表中文件的迭代计数器。

在生成了热量组件之后,我在另一个wxs文件中创建了另一个ComponenGroup,该文件包含对由heat创建的每个ComponentGroup的ComponentGroupRefs。

由于这个ComponentGroup是从cmd文件创建的,我知道我的ID,我可以在我的功能中引用它。

    @echo off
setlocal enabledelayedexpansion

set /a count = 0
FOR /F "delims=;" %%a IN (FileList.txt) DO (
set /a count=count+1
heat.exe file "%%a" -cg "ComponentGroup!count!" -gg -g1 -sfrag -dr NotSureWhatGoesHereYet %%~da -out "%~dp0%%~na.wxs" 
)

(
echo ^<?xml version="1.0" encoding="utf-8"?^>
echo ^<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi"^>
echo      ^<Fragment^>
echo          ^<ComponentGroup Id="ComponentGroup"^>
) > test.wxs

FOR /L %%i IN (1,1,%count%) DO (
  echo              ^<ComponentGroupRef Id="ComponentGroup%%i" /^> >> Components.wxs
)

(
echo          ^</ComponentGroup^>
echo     ^</Fragment^>
echo ^</Wix^> 
) >> Components.wxs

感谢回复人员。 @TomBlodget我从你的第一个答案中汲取灵感。谢谢你的时间