wix - WiX 有条件地更改产品名称
问题描述
我有一个大的 .wxs 文件,并且需要在 Windows Server 操作系统上启动安装程序时将产品名称从MyApp Workstation 版本更改为MyApp 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]"/>
我希望这也可以帮助其他人。祝你好运。
解决方案
ProductName 属性只能在安装开始之前更改。一旦 MSI 运行,它就是不可变的。
您尝试的预处理器语句影响构建时间而不是安装时间。
做你想做的事情的唯一方法是创建一个具有不同名称的转换,然后使用引导程序在非服务器操作系统上安装没有转换的 MSI,并在服务器操作系统上安装带有转换的 MSI。
就个人而言,这不是典型的做法,所以我会拒绝 PM 的要求。我会努力的唯一原因是业务真的在营销方面真正区分了品牌。否则通常不会这样做。
推荐阅读
- javascript - 如何在 Angular 中使用单独的 .ts 文件中的动画触发器?
- javascript - NgOnInit 没有在服务订阅中执行代码
- swift - 从 pod 资产中读取命名颜色
- android - WebRTC Flutter:将流录制到带有音频的文件中
- java - Gc 日志不打印
- javascript - Javascript - 重组对象数组
- r - 优化算法以最大化 R 中的两个变量
- javascript - NestJS websocket 的动态事件名称
- java - 如何使用java将一个文件传输到另一个位置
- powershell - 尝试通过 Powershell 运行 Excel 宏时出错