如何在WiX中枚举子目录?

时间:2013-06-24 17:27:00

标签: list directory wix subdirectory enumerate

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

每个安装程序都会安装多个网站,每个网站都有自己的文件夹结构(例如\ 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拥有特定文件夹列表的原因是因为它将遍历这些文件夹并执行大量自定义任务,我不希望它通过该网站下的每个网站父文件夹,但只包含属于当前安装的网站文件夹。

1 个答案:

答案 0 :(得分:0)

自定义操作中的

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

或者 - 继续您对自定义操作的想法 - 在.wixproj文件中使用MSBuild XslTransformation task(它是一个MSBuild项目文件),将.wxs文件中的相关数据转换为{{3} } file将定义您的CustomAction元素。您可以将XslTransformation任务放在BeforeBuild目标中,如您在项目文件中找到的注释中所述。 (一点点XSL不是太复杂;也不是一点点MSBuild ...特别是与Windows Installer相比。)

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