【问题标题】:How do I enumerate child directories in WiX?如何枚举 WiX 中的子目录?
【发布时间】:2013-06-21 07:26:44
【问题描述】:

我的项目包含多个安装程序(用于安装不同的应用程序和网站),它们都安装在同一个父文件夹(例如 \Websites)下。我的每个安装程序都会调用一个执行 C# 控制台应用程序(由所有安装程序共享)的 CustomAction,并传入几个特定于该安装程序的参数。

每个安装程序都会安装多个网站,每个网站都有自己的文件夹结构(例如 \Websites\App1、\Websites\App2 等)。

例如,在一个安装程序中:

<DirectoryRef Id="WebsitesFolder">
    <Directory Id="App1Folder" Name="App1"/>
    <Directory Id="App2Folder" Name="App2"/>
</DirectoryRef>

在另一个安装程序中:

<DirectoryRef Id="WebsitesFolder">
    <Directory Id="App3Folder" Name="App3"/>
    <Directory Id="App4Folder" Name="App4"/>
    <Directory Id="App5Folder" Name="App5"/>
    <Directory Id="App6Folder" Name="App6"/>
</DirectoryRef>

有没有办法将子目录列表枚举到逗号分隔的列表中,以作为参数传递给我的自定义操作?例如,如下所示。

<CustomAction Id="ConfigureWebsites" Directory="WebsitesFolder" ExeCommand="&quot;[%DEPLOYEXE]&quot; /d:&quot;[WebsitesFolder]\<list child directories here>&quot;" Execute="deferred" Return="ignore" />

在一个安装程序中生成以下内容:

deploy.exe /d:"C:\Websites\App1,C:\Websites\App2"

在第二个安装程序中:

deploy.exe /d:"C:\Websites\App3,C:\Websites\App4,C:\Websites\App5,C:\Websites\App6"

我知道我可以明确列出我的 CustomAction 中的所有子文件夹,但这些项目正在增长,并且子文件夹一直被添加到这些安装程序中,或者文件夹名称可能会随着时间而改变,我不想维护多个位置的文件夹名称列表。

我希望 deploy.exe 有一个特定的文件夹列表的原因是因为它会遍历这些文件夹并执行许多自定义任务,我不希望它遍历该文件夹下的每个网站父文件夹,但仅限于当前安装中的网站文件夹。

【问题讨论】:

    标签: list directory wix subdirectory enumerate


    【解决方案1】:

    Enumerat[ing] child directories 在您的自定义操作中将是正确的方法。 WiX 为 Windows Installer API 提供 DTF 包装器。您可以在 C# 中编写自定义操作,以执行所有必需的安装、回滚、卸载方案,就像正确的自定义操作一样。要查找受影响的子目录,您将在 Directory table 中找到网站目录,然后获取表中的所有目录,并将其作为父目录。获得目录 ID 后,使用 DTF 的 GetTargetPath (MsiGetTargetPath) 获取它们的安装位置,并针对场景采取适当的措施。请参阅 WiX 附带的 DTF 文档。

    或者 - 继续您的自定义操作的想法 - 在您的 .wixproj 文件(它是一个 MSBuild 项目文件)中使用 MSBuild XslTransformation task 将相关数据从您的 .wxs 文件转换为 WiX Include 文件,您的将定义 CustomAction 元素。您可以将 XslTransformation 任务放在 BeforeBuild 目标中,如您在项目文件中找到的 cmets 中所述。 (一点点 XSL 并不太复杂;一点点 MSBuild 也不算……尤其是与 Windows Installer 相比。)

    注意:要在 Visual Studio 中编辑项目文件,请在解决方案资源管理器中右键单击项目并选择卸载。然后再次右键单击并选择编辑。

    【讨论】:

      猜你喜欢
      • 2018-07-21
      • 1970-01-01
      • 2016-10-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多