2013-10-21 27 views
2

我試圖建立一個與INSTALLDIR目錄下的一個適當的名稱創建一個目錄多實例安裝:SetDirectory與目錄屬性

<Directory Id="INSTALLDIR" Name="My Product"> 
    <Directory Id="SERVERDIR" Name="Server" /> 
</Directory> 
<SetDirectory Id="SERVERDIR" Value="[INSTALLDIR]Server ([INSTANCEID])">NOT (INSTANCEID="DEFAULT")</SetDirectory> 

我想至少希望INSTALLDIR屬性會已經在InstallExecute序列開始時傳入,即使大多數其他目錄尚未由CostFinalize解析。有沒有辦法在CostFinalize之前找到用戶指定的安裝目錄,以便我可以正確設置SERVERDIR路徑?


更新1:我猜在大多數情況下INSTALLDIR本身得到由CostFinalize,除非它的命令行(所以爲什麼它是空白給我)的設置解決。除非已由用戶設置,否則我可以擁有自己的屬性,該屬性默認爲我希望INSTALLDIR所在的位置。需要弄清楚UI如何傳遞它 - 希望它正常地傳遞INSTALLDIR。


更新2:UI通過INSTALLDIR。但它也傳遞所有其他解析的目錄,包括SERVERDIR下的目錄。我需要在兩個序列中運行SetDirectory動作,並自己提供一個默認的INSTALLDIR屬性。我也應該給自己買一個rubber duck

回答

2

SetDirectory可以在格式化字符串中使用屬性,但是在設置這些屬性時需要小心。在一個正常的UI安裝:

  • InstallUISequence運行
    • CostFinalize解析和設置目錄屬性
    • 對話框示(INSTALLDIR已由CostFinalize設置)
  • InstallExecute運行
    • 安裝目錄屬性被壓入序列

SetDirectory元素在CostFinalize之前運行,並且它使用的路徑必須是完整路徑。要將SERVERDIR屬性基於上述INSTALLDIR屬性設置,請確保已設置默認INSTALLDIR以表示解析通常會發生的方式:

<SetDirectory Action="SetInstallDir" Id="INSTALLDIR" Value="[$(var.Variables_ProgramFilesFolderId)]$(var.Variables_ManufacturerDir)\$(var.Variables_ProductNameShort)\">INSTALLDIR=""</SetDirectory> 
<SetDirectory Action="SetServerInstallDir" Id="SERVERINSTALLDIR" Value="[INSTALLDIR]Server ([INSTANCEID])\">NOT (INSTANCEID="DEFAULT")</SetDirectory>