2013-06-24 64 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中編輯項目文件,請右鍵單擊項目中的解決方案資源管理器並選擇卸載。然後再次右鍵單擊並選擇編輯。