如何使用更新条件在 Wix 中设置变量?
Posted
技术标签:
【中文标题】如何使用更新条件在 Wix 中设置变量?【英文标题】:How can I use an update condition to set variables in Wix? 【发布时间】:2017-11-27 08:38:14 【问题描述】:我们正在使用 Wix V3.11 为我们的 C#-应用程序构建一个 msi 设置。我们为每个版本提供 32 位和 64 位版本:
32 位 版本的预分配安装路径是:'C:\Program Files (x86)'。
64 位 设置的预分配安装路径是:'C:\Program Files'。
我们使用以下声明来设置路径:
<?define bitness = $(var.Platform) ?>
<?if $(var.Platform) = "x86" ?>
<?define ProgramFilesPath = ProgramFilesFolder?>
<?define Win64 = no?>
<?else?>
<?define ProgramFilesPath = ProgramFiles64Folder?>
<?define Win64 = yes?>
<?endif?>
在这里使用变量:
<Directory Id="TARGETDIR" Name="SourceDir">
<Directory Id="$(var.ProgramFilesPath)" Name="$(var.ProgramFilesPath)">
[... more folder ...]
</Directory>
</Directory>
问题:当消费者将第一次安装的路径更改为例如'C:/MyFolder' 并执行更新,然后 msi 设置将软件移动到 'C:\Program Files (x86)' 或 'C:\Program Files'。
问题:如何在更新时保留第一次安装的自定义安装路径“C:/MyFolder”?也许我可以使用任何“更新”条件?我的想象:
<?define bitness = $(var.Platform) ?>
<?if UPDATE ?> <!-- here -->
<?if $(var.Platform) = "x86" ?>
<?define ProgramFilesPath = ProgramFilesFolder?>
<?define Win64 = no?>
<?else?>
<?define ProgramFilesPath = ProgramFiles64Folder?>
<?define Win64 = yes?>
<?endif?>
<?endif?>
【问题讨论】:
【参考方案1】:假设“更新”是指重大升级,因为如果补丁或次要更新将所有文件从一个位置移动到另一个位置,那将是非常奇怪的。
如果您使用通常的 WiX 属性名称,则用户选择的目录将是 INSTALLFOLDER,但不清楚您使用的是该名称还是 TARGETDIR。基本上,您可以将用户的最终选择存储在注册表项中(或使用 WiX“记住属性”模式)。在主要升级中,您可以检索该属性并将您的 INSTALLFOLDER 值设置为该目录,条件是设置了 WIX_UPGRADE_DETECTED(主要升级元素中使用的默认属性 ID)。大概您还将禁止允许用户选择文件夹的浏览对话框。
话虽如此:
如果应用程序继续运行,您为什么不希望用户在他们愿意的情况下将主要升级安装到新位置,这一点尚不清楚。
这些默认文件夹并没有真正预先分配 - 它们只是标准默认值。它们是推荐的位置,因此最好禁止更改它们,因为可能会出现意外行为。例如,尝试将 32 位 MSI 安装到 x64 系统上的本机程序文件文件夹将导致重定向到程序文件 (x86) 位置,这可能会让用户感到惊讶。
【讨论】:
以上是关于如何使用更新条件在 Wix 中设置变量?的主要内容,如果未能解决你的问题,请参考以下文章
Wix 3.7 Burn - 如何使用动态信息制作自定义启动画面