我正在尝试构建一个多实例安装程序,在INSTALLDIR目录下创建一个具有适当名称的目录:
<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。
答案 0 :(得分:2)
SetDirectory可以使用格式化字符串中的属性,但是在设置此类属性时需要注意。在普通的UI安装中:
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>