2013-06-24 67 views
0

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

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

回答

0

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

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

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