【发布时间】:2020-01-15 22:24:16
【问题描述】:
我有一个大的 .wxs 文件,并且需要在安装程序时将 产品名称 从 MyApp Workstation 版本 更改为 MyApp Server 版本在 Windows Server 操作系统上启动。我读了很多,我发现我需要与以下 MSI 属性 MsiNTProductType 相关联,它返回值 1 代表工作站,返回值 2 或 3 代表服务器操作系统。
<?xml version="1.0" encoding="UTF-8"?>
<?define ProductName = "MyApp Workstation version" ?>
<Wix>
<Product Name="$(var.ProductName)" ... >
...
</Product>
</Wix>
如果我使用如下条件,它会检测到我使用的是工作站操作系统(在我的情况下为 Windows 10),但这不是我想要的:
<Condition Message="This installer is for Windows Server only!">
<![CDATA[(MsiNTProductType > 1)]]>
</Condition>
我尝试了预处理器变量的方法,但显然它不起作用:
<?if MsiNTProductType = 1 ?>
<?define ProductName = "MyApp Workstation version" ?>
<?else ?>
<?define ProductName = "MyApp Server version" ?>
<?endif ?>
我还尝试了 SetProperty 和 CustomAction,但没有任何运气。我被困在这个问题上。
有可能做这样的事情吗?为了实现这一点,我必须做出哪些改变?我对 WIX 很陌生,我不明白它应该如何工作。谢谢。
后期编辑和解决方案
在尝试了数十种组合很多天之后,我能够使用以下代码来做到这一点,该代码放在任何已经定义的 CustomAction 之前:
<Property Id="ConditionalProductName" Value="MyApp Workstation version" />
<SetProperty Id="ConditionalProductName" Before="LaunchConditions" Value="MyApp Server version" >
<![CDATA[(MsiNTProductType > 1)]]>
</SetProperty>
<SetProperty Id ="ProductName" Before ="LaunchConditions" Value ="[ConditionalProductName]"/>
我希望这对其他人也有帮助。祝你好运。
【问题讨论】:
-
今晚没时间正确回答。但是:预处理器变量是编译时构造,您可以使用它来编译设置的单独版本。这就是我提供服务器和工作站设置的方式,以便它们可以独立修复错误,例如 - more on that here。
-
在运行时通过自定义操作设置 ProductName 属性可能有效,但我不建议这样做,因为该属性涉及产品注册。两个版本的 MSI 文件名必须保持相同以支持修补(不确定产品名称)。但是,您可以在转换中更改 ProductName - 用于自定义 MSI 文件以进行企业部署的概念。例如,启动器 setup.exe 可以在运行时应用“服务器转换”来更改产品名称。
-
See my comments on patching here。还有其他方法可以根据涉及 GUI 更改的目标机器显示自定义文本。 您真正需要什么? 设置是否应该更改其他内容,还是“显示问题”?也许您安装了不同的功能?
-
只是显示问题。没有什么真正改变,功能是一样的。这是一个 PM 的东西,它希望根据操作系统显示不同的字符串。
标签: wix windows-installer conditional-statements