2

我正在尝试构建一个多实例安装程序,该安装程序在 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 属性。我也应该给自己买一只橡皮鸭

4

1 回答 1

3

SetDirectory 可以使用格式化字符串中的属性,但您需要注意何时设置此类属性。在正常的 UI 安装中:

  • InstallUISequence 运行
    • CostFinalize 解析并设置目录属性
    • 显示对话框(INSTALLDIR 已由 CostFinalize 设置)
  • 安装执行运行
    • 安装目录属性按顺序推送

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>
于 2013-10-21T16:52:11.817 回答