【问题标题】:How can I add ComponentGroupRefs to a feature automatically after generating fragments with heat.exe如何在使用 heat.exe 生成片段后自动将 ComponentGroupRefs 添加到功能中
【发布时间】:2017-11-07 18:56:29
【问题描述】:

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

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

到目前为止,我从 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 赋予相同的名称,这会带来问题,但我可以通过使用组件组名称中的文件名来解决这个问题。 em>

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

我已经阅读了 Wix Toolset Documentation Manual 和本书WiX 3.6: A Developer's Guide to Windows Installer XML 中的相关部分,但不知道如何执行此操作。

我很感激我可以使用某种形式的文本替换来做到这一点,但我希望 Wix 工具集中有一些内置的东西,因为我不能成为第一个需要动态创建发热组件的人。

【问题讨论】:

  • 您可以生成一个 WXS 文件,其中包含一个“主”组件组,该组件组将引用所有热生成的组件组。在“project.wxs”文件的特征元素中引用这个“主”组件组。这样您就不必一直更改“project.wxs”。
  • 如果您使用 heat 获取目录,您将获得一个包含所有已获取组件的组件组。简单引用
  • 我无法获取目录,因为目录中包含我不想包含在安装程序中的其他文件。
  • 如果我有一个引用热量产生的组件组的“主”组件组,我仍然会遇到如何创建这个“主”组件组的问题。我看不到如何引用产生热量的组件组的组件组 ID,而无需在“主要”组件组内或作为功能中的单个条目创建组件组引用的某种手动过程。它是我试图自动化的手动任务,或者作为调用 heat 的一部分,或者使用 Wix 工具集的其他部分。谢谢
  • 一种技术是创建一个文件夹结构来从中获取信息。另一种方法是通过热传递 XSL 转换以过滤其输出来删除不需要的组件(例如,通过部分路径识别)。当然,您可以同时使用两者。 (有时通过调整应用开发者和安装者开发者或应用项目和安装者项目之间的分工来解决问题。)

标签: wix


【解决方案1】:

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

热组件生成后,我在单独的 wxs 文件中创建另一个组件组,其中包含热创建的每个组件组的 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 我从您的第一个答案中获得灵感。感谢您的宝贵时间

【讨论】:

    猜你喜欢
    • 2011-09-03
    • 1970-01-01
    • 2011-03-07
    • 2021-06-15
    • 1970-01-01
    • 2016-10-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多